使用按位运算符查找是否每个偶数位都设置为0

Tre*_*vin 6 c logic bit-manipulation

我有一个32位的int我一次只能访问它8位.我需要找出每个偶数位是否设置为0,如果为真,则返回0,否则返回1.

到目前为止,我将使用转换为4位,8位变量来拆分我的int.int a,b,c,d

现在我要不要他们所以现在我将测试该位是否设置为1而不是0.要测试它是否设置为1我将和01010101.

现在我不知道如何判断每个偶数位是否设置为1.我不能使用if/for/while循环或任何条件语句并且需要使用按位运算符.有任何想法吗????

And*_*erd 5

好的,所以你创建了一个位掩码.(01010101)

 if ((value & bit_mask) == bit_mask)
Run Code Online (Sandbox Code Playgroud)

那么你知道,这是坐落在每个位bit_mask中也设置value.


更新:(正确阅读问题后)

您想要检查每个第二位是否设置为0.(未设置为1,因为我上面的错误答案检查)

有两种同样有效的方法:我们使位掩码相反(10101010)

然后使用OR运算符:

if ((value | bit_mask) == bit_mask)
Run Code Online (Sandbox Code Playgroud)

这将检查零中的每个位bit_mask为零value.

第二种方法是使位掩码相同(01010101)并使用AND运算符:

if ((value & bit_mask) == 0)
Run Code Online (Sandbox Code Playgroud)

这将检查其中的每个位bit_mask是否为零value.

  • @Matt即使只设置了几个位,但并非所有的`value&bitmask`都会计算为非零,所以如果你想知道位掩码中的所有位都设置为值,则无法删除与位掩码相等的测试. (2认同)

fvu*_*fvu 3

编辑:我对原来的问题感到困惑,并在否定中遵循OP - 所以基本上这解决了相反的问题。Andrew Sheperd 编辑后的解决方案从最初的问题开始,一步解决。Rudy Velthuis 还提供了一种有趣的方法。

如果您的字节值 AND 01010101 == 01010101 掩码选择的所有位在原始字节值中均为 1。

在某种伪 C 中:

unsigned char mask = 0x55;

if ((byteval & mask) == mask) {
    printf ("all set");
}
Run Code Online (Sandbox Code Playgroud)

或基于异或的稍微更奇特的变体

unsigned char mask = 0x55;

if (!((byteval & mask) ^ mask)) {
    printf ("all set");
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,if对于最终结果来说,很容易摆脱它......