如果仅使用按位和逻辑运算符将任何偶数位设置为 1,则返回 1

cha*_*rge 1 c binary bit-manipulation

我目前陷入了一个需要编写的函数,该函数检查是否有偶数位设置为 1。例如,evenBit(0x1)返回 1、evenBit(0x2)返回 0 和evenBit(0xFFFFFFFF)返回 1。目前我的evenBit()函数如下所示:

unsigned int evenBit(unsigned int x) {
    unsigned int evenMask = 0x55555555;
    return x & evenMask;
}
Run Code Online (Sandbox Code Playgroud)

但这些并没有返回我期望的结果,但我不完全确定如何解决这个问题。我想用掩码隔离偶数位,我已经这样做了,但我不确定如何处理结果,使其变为 1。我只能使用按位和逻辑运算符(&、|、 !);没有 if 语句、循环、算术运算符(+、-、*、/、%)或条件运算符(==、!= 等)。

And*_*zel 5

您发布的代码已经是正确的,因为evenBit如果设置了任何位,则该函数将返回非零值(true),如果没有设置,则返回零(false)。

如果您想将返回值限制为01,那么您可以更改该行

return x & evenMask;
Run Code Online (Sandbox Code Playgroud)

到:

return !!( x & evenMask );
Run Code Online (Sandbox Code Playgroud)

这将应用逻辑非运算符!两次。

逻辑非运算符将计算0其操作数是否非零,以及1其操作数是否为零。因此,此操作给出的结果与您想要的结果完全相反。再次应用逻辑非运算符将得到所需的结果。

通常,程序员会这样写

return ( x & evenMask ) != 0;
Run Code Online (Sandbox Code Playgroud)

或者

return ( x & evenMask ) ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

达到完全相同的结果,但这将违反您的问题中仅使用按位和逻辑运算符的限制。