【问题标题】:How to go through each bit of a byte如何遍历一个字节的每一位
【发布时间】:2010-12-16 21:21:02
【问题描述】:

我不知道如何实现以下算法。

例如我有 int=26,这是二进制的“11010”。 现在我需要对 1 执行一个操作,对 0 执行另一个操作,从左到右,直到字节结束。 但我真的不知道如何实现这一点。 也许我可以将二进制转换为 char 数组,但我不知道如何。 顺便说一句,int 仅在示例中等于 26,在应用程序中它将是随机的。

【问题讨论】:

标签: c algorithm


【解决方案1】:

既然你想从“左到右”移动:

unsigned char val = 26;  // or whatever

unsigned int mask;

for (mask = 0x80; mask != 0; mask >>= 1) {

    if (val & mask) {
        // bit is 1
    }
    else {
        // bit is 0
    }
}

for 循环只是遍历一个字节中的每个位,从最高有效位到最低位。

【讨论】:

  • 我不明白为什么 val 是无符号字符?
  • 还有掩码,我不知道,这个值会持续多久。我随机生成它。
  • 我使用了unsigned char,因为您表示您有兴趣对每个位执行“直到字节结束”的操作。如果您对大于一个字节的对象感兴趣,请使用适当的类型,但您需要更改mask 中的起始位。注意:mask 不是随机的 - 它跟踪每一步检查的位。如果您希望您检查的位的值是随机的,那很好。但是,将其设置为您想要的任何内容。我在示例中使用了26,因为这就是您在示例中使用的。设置为您的应用程序所需的任何数据。
  • 你说你想遍历一个字节的每一位;一个字符是一个字节。如果你想遍历一个 int 的每一位,你可以这样做(但使用不同的起始掩码,正如前面的评论所说)。
  • 初始化 mask=1<<7 而不是 mask=0x80 可能会更自文档化。相比之下,对于 int,您可以从mask=1<<31 开始,从最高有效位开始,或者从mask=1<<7 开始,如果您想从最低有效字节的最高有效位开始。
【解决方案2】:

我使用这个选项:

isBitSet = ((bits & 1) == 1);
bits = bits >> 1

我也在 stackoverflow 中找到了答案:

How do I properly loop through and print bits of an Int, Long, Float, or BigInteger?

【讨论】:

    【解决方案3】:

    您可以使用模算术或位掩码来获得所需的内容。

    模运算:

    int x = 0b100101;
    // First bit
    (x >> 0) % 2; // 1
    // Second bit
    (x >> 1) % 2; // 0
    // Third bit
    (x >> 2) % 2; // 1
    ...
    etc.
    

    位掩码

    int x = 0b100101;
    int mask = 0x01;
    // First bit 
    ((mask << 0) & x) ? 1 : 0
    // Second bit
    ((mask << 1) & x) ? 1 : 0
    ...
    etc.
    

    【讨论】:

      【解决方案4】:

      在 C、C++ 和类似语法的语言中,您可以通过检查 i &amp; 1 是非零还是零来确定整数 i 中最右边的位是 1 还是 0。 (请注意,这是一个单一的&amp; 表示按位与运算,而不是一个&amp;&amp; 表示逻辑与。)对于右第二位,您检查i &amp; 2;对于第三个,您检查i &amp; 4,依此类推。

      更一般地,要确定右边的jth 位是否为零,您可以检查i &amp; (1 &lt;&lt; (j-1)) != 0 是否。 &lt;&lt; 表示左移; 1 &lt;&lt; (j-1) 本质上等同于 2j-1

      因此,对于 32 位整数,您的循环将如下所示:

      unsigned int i = 26;  /* Replace this with however it's actually defined.  */
      
      int j;
      for (j = 31; j >= 0; j--)
      {
        if ((i & (1 << (j-1))) != 0)
          /* do something for jth bit is 1 */
        else
          /* do something for jth bit is 0 */
      }
      

      希望这足以让您入门。

      【讨论】:

      • 不是常数26,只是举例。
      • 我应该更清楚 - 我在我的代码中分配“i = 26”作为示例,如下所示;我假设您会以其他方式定义它。我会澄清的。
      【解决方案5】:

      遇到了类似的问题,所以我想分享我的解决方案。这是假设您的值始终是一个字节(8 位)

      遍历字节内的所有 8 位并检查该位是否已设置(您可以通过将我们正在检查的位移动到 LSB 位置并使用 0x01 屏蔽它来做到这一点)

      int value = 26;
      for (int i = 0; i < 8; i++) {
          if ((value >> i) & 0x01) {
              // Bit i is 1
              printf("%d is set\n", i);
          }
          else {
              // Bit i is 0
              printf("%d is cleared\n", i);
          }
      }
      

      【讨论】:

        【解决方案6】:

        我不确定你说你想做什么。如果有帮助,您可能可以使用位掩码对字节进行任何位操作。

        【讨论】:

          【解决方案7】:

          嗨 查找位移位和位与。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-09
            相关资源
            最近更新 更多