迭代C中的位

use*_*655 5 c bit bitarray

我有一个很大的char*str,其中前8个字符(如果我没有错,则等于64位)代表一个位图.有没有办法迭代这8个字符,看看哪些位是0?我在理解位的概念方面遇到了很多麻烦,因为你无法在代码中"看到"它们,所以我想不出任何方法来做到这一点.

Vin*_*ura 8

想象一下,你只有一个字节,一个字符my_char.您可以使用按位运算符和位移来测试各个位.

unsigned char my_char = 0xAA;
int what_bit_i_am_testing = 0;

while (what_bit_i_am_testing < 8) {
  if (my_char & 0x01) {
     printf("bit %d is 1\n", what_bit_i_am_testing);
  }
  else {
     printf("bit %d is 0\n", what_bit_i_am_testing);
  }

  what_bit_i_am_testing++;
  my_char = my_char >> 1;
}
Run Code Online (Sandbox Code Playgroud)

对您来说必不可少的部分是>>运营商.该操作符将"在左侧插入零并向右推动每一位,最右侧将被抛弃".

对于1的正确位移,这不是一个非常技术性的描述.

  • 最好强调`my_char`必须是`unsigned`,这个代码才能正确地为所有值工作(而不是为某些值永远运行). (4认同)
  • @Jean-BaptisteYunès 为什么不合适?my_char 可以只是一个临时变量...`my_char = my_bitmap[1234];` (2认同)

Cra*_*een 5

这是一种迭代无符号整数的每个设置位的方法(使用无符号而不是有符号整数来实现明确定义的行为;任何宽度的无符号都应该没问题),一次一位。

\n

定义以下宏:

\n
#define LSBIT(X)                    ((X) & (-(X)))\n#define CLEARLSBIT(X)               ((X) & ((X) - 1))\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您可以使用以下习惯用法来迭代设置的位,首先是 LSbit:

\n
unsigned temp_bits;\nunsigned one_bit;\n\ntemp_bits = some_value;\nfor ( ; temp_bits; temp_bits = CLEARLSBIT(temp_bits) ) {\n    one_bit = LSBIT(temp_bits);\n    /* Do something with one_bit */\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我不确定这是否适合您的需求。你说你想检查0位,而不是1位 \xe2\x80\x94 也许你可以按位反转初始值。另外,对于多字节值,您可以将其放入另一个for循环中以一次处理一个字节/字。

\n