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

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

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

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

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

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

if ((value & bit_mask) == bit_mask) 

那么你知道在bit_mask中设置的每个位也是在value设置的。


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

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

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

然后使用OR运算符:

 if ((value | bit_mask) == bit_mask) 

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

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

 if ((value & bit_mask) == 0) 

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

编辑:我对原始问题感到困惑,并在否定事情中遵循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很容易摆脱最后的结果……

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

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

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

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

  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 

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

 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的其他值。