想象一下,你只有一个字节,一个字符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的正确位移,这不是一个非常技术性的描述.
这是一种迭代无符号整数的每个设置位的方法(使用无符号而不是有符号整数来实现明确定义的行为;任何宽度的无符号都应该没问题),一次一位。
\n定义以下宏:
\n#define LSBIT(X) ((X) & (-(X)))\n#define CLEARLSBIT(X) ((X) & ((X) - 1))\nRun Code Online (Sandbox Code Playgroud)\n然后,您可以使用以下习惯用法来迭代设置的位,首先是 LSbit:
\nunsigned 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}\nRun Code Online (Sandbox Code Playgroud)\n我不确定这是否适合您的需求。你说你想检查0位,而不是1位 \xe2\x80\x94 也许你可以按位反转初始值。另外,对于多字节值,您可以将其放入另一个for循环中以一次处理一个字节/字。
| 归档时间: |
|
| 查看次数: |
22315 次 |
| 最近记录: |