【问题标题】: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 :-)

标签: c logic bit-manipulation


【解决方案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 语句或循环
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      相关资源
      最近更新 更多