使用按位运算符查找每个偶数位是不是设置为 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 步完全是多余的。只要您使用and0x55,这些位就会消失。 是的,现在已经修改了答案,,【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章

Python按位运算混淆

136.137.260. Single Number && 位运算

仅使用按位运算的有效方法

位运算符,原码反码补码

按位非运算符

位操作符和位运算