我有一个32位的int我一次只能访问它8位。我需要找出每个偶数位是否设置为0,如果为真,则返回0,否则返回1.
到目前为止,我将使用转换为4位,8位变量来拆分我的int。 int a,b,c,d
现在我不打算这样做,现在我将测试该位是否设置为1而不是0。 要测试它是否设置为1我将和01010101。
现在我不知道如何判断每个偶数位是否设置为1.我不能使用if / for / while循环或任何条件语句并且需要使用按位运算符。有任何想法吗????
答案 0 :(得分:5)
好的,所以你创建了一个位掩码。 (01010101)
if ((value & bit_mask) == bit_mask)
然后您知道bit_mask
中设置的每个位也在value
中设置。
<小时/> 更新:(正确阅读问题后)
您想要检查每个第二位是否设置为0.(未设置为1,因为我上面的错误答案会检查)
有两种同样有效的方法: 我们使位掩码相反(10101010)
然后使用OR运算符:
if ((value | bit_mask) == bit_mask)
这会检查bit_mask
中value
为零的每个位是否为if ((value & bit_mask) == 0)
。
第二种方法是使位掩码相同(01010101)并使用AND运算符:
bit_mask
这会检查value
中{{1}}中的每个位是{{1}}中的零。
答案 1 :(得分:3)
如果你的字节值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的其他值。