使用按位运算符查找每个偶数位是不是设置为 0
Posted
技术标签:
【中文标题】使用按位运算符查找每个偶数位是不是设置为 0【英文标题】:Find if every even bit is set to 0 using bitwise operators使用按位运算符查找每个偶数位是否设置为 0 【发布时间】:2011-11-05 17:01:19 【问题描述】:我有一个 32 位的 int,我一次只能访问 8 位。我需要确定每个偶数位是否设置为 0,如果为真则返回 0,否则返回 1。
到目前为止,我将使用移位将我的 int 拆分为 4、8 位变量。 整数a,b,c,d
现在我不打算使用它们,所以现在我将测试该位是否设置为 1 而不是 0。 为了测试它是否设置为 1,我会在 01010101 之前和它们。
现在我不知道如何判断每个偶数位是否设置为 1。我不能使用 if/for/while 循环或任何条件语句,需要使用按位运算符。有任何想法吗????
【问题讨论】:
先向我们展示您拥有的东西。我不是为你做作业。 不幸的是,马特,不是所有人都同意:( @Matt H - 我回答了他的问题,因为它是“原子的”。他已经迈出了识别要使用的位掩码的步骤,所以只差一步了。我发现使用按位算术,人们只有在看到有效答案后才会“明白”。 他说没有条件陈述的人请在回答之前仔细阅读问题:P @niko 条件句很容易分解 - 作业应该仍然是一个挑战 eh :-) 【参考方案1】:好的,你已经创建了一个位掩码。 (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
中为1 的每一位在value
中是否为零。
【讨论】:
或者简单地说“if (value & bit_mask)”。因为如果不是真的,它会返回 0,如果是,它会 > 0。 @Matt 即使只设置了几个位但并非所有value & bitmask
都将评估为非零,因此如果您想知道位掩码中的所有位,则无法删除与位掩码相等的测试在值中设置。
@fvu:他想知道是否每个位都是 CLEAR(设置为 0),所以 (value & bit_mask) == 0
是他想要的
@Chris Dodd - 我没有正确阅读问题的错误。我已经相应地更新了我的答案。
他还说他不被允许使用“如果”很奇怪。【参考方案2】:
编辑:我对原始问题感到困惑,并在否定事情中遵循 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
很容易摆脱最终结果...
【讨论】:
【参考方案3】:不需要针对 0x55 的掩码测试每个单独的字节。只需将字节“或”在一起并根据掩码测试结果:
return ((a | b | c | d) & 0x55 != 0);
任何偶数位设置为 1 将使“与”的结果不再为 0,因此将返回 1。如果所有偶数位为 0,则返回 0。
【讨论】:
【参考方案4】:逻辑是利用算术运算符,, 尝试以下步骤,
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
【讨论】:
第 1 步完全是多余的。只要您使用and
和0x55
,这些位就会消失。
是的,现在已经修改了答案,,【参考方案5】:
只需取一些整数变量并将值存储在其中。
i= ( a & 0x55 ) + (b & 0x55 ) + ( c & 0x55 ) + (d & 0x55 )
如果所有偶数位都设置为零,则变量 i 的值为 0,否则大于 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 的其他值。
【讨论】:
没有 if 语句或循环以上是关于使用按位运算符查找每个偶数位是不是设置为 0的主要内容,如果未能解决你的问题,请参考以下文章