Return 1 如果仅使用按位和逻辑运算符将任何偶数位设置为 1
Return 1 if any even bit is set to 1 using only bitwise and logical operators
我目前卡在一个我需要编写的函数上,该函数检查是否有偶数位设置为 1。例如,evenBit(0x1)
returns 1,evenBit(0x2)
returns 0,和 evenBit(0xFFFFFFFF)
returns 1。目前我的 evenBit()
函数如下所示:
unsigned int evenBit(unsigned int x) {
unsigned int evenMask = 0x55555555;
return x & evenMask;
}
但是这些并没有返回我期望的结果,但我不完全确定如何处理这个问题。我想用我已经完成的掩码隔离偶数位,但我不确定如何处理之后的结果,这样它就会变成 1。我只能使用按位和逻辑运算符(&、|、 !);没有 if 语句、循环、算术运算符(+、-、*、/、%)或条件运算符(==、!= 等)。
从某种意义上说,您发布的代码已经正确,如果设置了任何位,函数 evenBit
将 return 一个非零值 (true),否则为零 (false)。
如果要将 return 值限制为 0
和 1
,则可以更改行
return x & evenMask;
至:
return !!( x & evenMask );
这将应用逻辑非运算符 !
两次。
如果操作数非零,则逻辑非运算符的计算结果为 0
,如果操作数为零,则计算结果为 1
。因此,此操作会为您提供与您想要的结果完全相反的结果。再次应用逻辑非运算符将为您提供所需的结果。
通常,程序员会写
return ( x & evenMask ) != 0;
或
return ( x & evenMask ) ? 1 : 0;
获得完全相同的结果,但这将违反您在仅使用按位和逻辑运算符的问题中所述的限制。
按要求仅使用按位运算符(和赋值),
x |= x >> 16;
x |= x >> 8;
x |= x >> 4;
x |= x >> 2;
return x & 1;
与 OP 一样,我假设 x
是一个 32 位无符号整数,但不能保证如此。 unsigned int
可以更小或更大。
我目前卡在一个我需要编写的函数上,该函数检查是否有偶数位设置为 1。例如,evenBit(0x1)
returns 1,evenBit(0x2)
returns 0,和 evenBit(0xFFFFFFFF)
returns 1。目前我的 evenBit()
函数如下所示:
unsigned int evenBit(unsigned int x) {
unsigned int evenMask = 0x55555555;
return x & evenMask;
}
但是这些并没有返回我期望的结果,但我不完全确定如何处理这个问题。我想用我已经完成的掩码隔离偶数位,但我不确定如何处理之后的结果,这样它就会变成 1。我只能使用按位和逻辑运算符(&、|、 !);没有 if 语句、循环、算术运算符(+、-、*、/、%)或条件运算符(==、!= 等)。
从某种意义上说,您发布的代码已经正确,如果设置了任何位,函数 evenBit
将 return 一个非零值 (true),否则为零 (false)。
如果要将 return 值限制为 0
和 1
,则可以更改行
return x & evenMask;
至:
return !!( x & evenMask );
这将应用逻辑非运算符 !
两次。
如果操作数非零,则逻辑非运算符的计算结果为 0
,如果操作数为零,则计算结果为 1
。因此,此操作会为您提供与您想要的结果完全相反的结果。再次应用逻辑非运算符将为您提供所需的结果。
通常,程序员会写
return ( x & evenMask ) != 0;
或
return ( x & evenMask ) ? 1 : 0;
获得完全相同的结果,但这将违反您在仅使用按位和逻辑运算符的问题中所述的限制。
按要求仅使用按位运算符(和赋值),
x |= x >> 16;
x |= x >> 8;
x |= x >> 4;
x |= x >> 2;
return x & 1;
与 OP 一样,我假设 x
是一个 32 位无符号整数,但不能保证如此。 unsigned int
可以更小或更大。