循环通过位C

WTL*_*WTL 2 c bit-manipulation bit

我试图遍历无符号字符的位,但我不知道从哪里开始,最终,我将对这些位执行其他按位操作,例如〜和xor..etc.

das*_*ght 6

循环比特可以通过以下几种方式完成:

  • 您可以在移动值时执行破坏性循环,并根据您要枚举位的顺序测试初始位或最终位,或者
  • 当你使用按位AND来测试带有单位掩码的数字时,你可以做一个非破坏性的循环,由左移产生1.

以下是第一种方法的示例:

unsigned int bits = ...;
while (bits) {
    if (bits & 1) {
        // Current bit is set to 1
    } else {
        // Current bit is set to 0
    }
    bits >>= 1;
}
Run Code Online (Sandbox Code Playgroud)

如果要在达到零后继续使用位,请创建一个单独的计数器.

以下是第二种方法的示例:

unsigned int bits = ...;
for (int pos = 0 ; pos != 16 ; pos++) {
    if (bits & (1 << pos)) {
        // Current bit is set to 1
    } else {
        // Current bit is set to 0
    }
}
Run Code Online (Sandbox Code Playgroud)


Sha*_*ger 0

好吧,从最低位到最高位,你可以像这样循环:

unsigned char somebyte = ...;
for (int i = 0; i < 8; ++i, somebyte >>= 1) {
    if (somebyte & 0x1) {
        // Do stuff for 1 bit
    } else {
        // Do stuff for 0 bit
    }
}
Run Code Online (Sandbox Code Playgroud)

但这是一个非常通用的用例;通常,您希望并行化您的工作(一次对整个字节进行操作),或者仅对 1 位进行操作(并在用完时停止而不是完成所有八个循环)等。需要更多上下文来解决特定问题问题而不是一般的循环。许多具体问题可以通过巧妙的技巧得到最有效的解决。