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

时间:2011-08-29 00:52:19

标签: 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循环或任何条件语句并且需要使用按位运算符。有任何想法吗????

5 个答案:

答案 0 :(得分:5)

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

 if ((value & bit_mask) == bit_mask)

然后您知道bit_mask中设置的每个位也在value中设置。

<小时/> 更新:(正确阅读问题后)

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

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

然后使用OR运算符:

if ((value | bit_mask) == bit_mask)

这会检查bit_maskvalue为零的每个位是否为if ((value & bit_mask) == 0)

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

bit_mask

这会检查value中{{1}}中的每个位是{{1}}中的零。

答案 1 :(得分:3)

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

如果你的字节值AND 01010101 == 01010101,掩码选择的所有位都是原始字节值的1。

在sortof伪C:

unsigned char mask = 0x55;

if ((byteval & mask) == mask) {
    printf ("all set");
}

或稍微有点基于xor的变体

unsigned char mask = 0x55;

if (!((byteval & mask) ^ mask)) {
    printf ("all set");
}

顺便说一下,if很容易摆脱最后的结果......

答案 2 :(得分:2)

无需可以针对0x55的掩码测试每个字节。只需将“或”字节放在一起,然后根据掩码测试结果:

return ((a | b | c | d) & 0x55 != 0);

任何偶数位设置为1都会使“和”的结果不再为0,因此它将返回1.如果所有偶数位都为0,则返回0。

答案 3 :(得分:1)

逻辑是利用算术运算符, 尝试以下步骤,

     1. AND the each result with 01010101
     2. then atlast AND all the results,, now if the resulting decimal value is 
      85(decimal(01010101))

然后结果是正确的,否则结果是错误的,

试试这个示例代码,

//assume a,b,c,d has the four parts of the bits,,
//do the following for each variable
Ar=a & 01010101
.
.
.
.
Dr=d & 01010101

//now AND all r2 for each variable..
r=Ar & Br & Cr & Dr

//now check the decimal equivalent of r and decide true if it is 85

答案 4 :(得分:0)

只需取一些整数变量并将值存储在其中。

i= ( a & 0x55 ) + (b & 0x55 ) + ( c & 0x55 ) + (d & 0x55 )

如果所有偶数位都设置为零,则变量i的值为0,否则大于0.并且任何不等于零的值在c中为真。

 a = 10101010 & 0x55 ( 01010101) which returns zero,masking all odd bits to zero
同样

 b & 0x55 and c & 0x55 and d & 0x55 

如果它们全部为零,则变量i的值为零,否则在c中可能被视为True的其他值。