使用按位运算符查找是否将每个偶数位设置为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的其他值。