理论
没有用于访问或设置内置数据类型(例如“char”)的第 n 位的 C 语法。但是,您可以使用逻辑 AND 操作访问位,并使用逻辑 OR 操作设置位。
例如,假设您有一个包含 1101 的变量,并且您想检查左侧的第二位。只需对 0100 执行逻辑与:
1101
0100
---- AND
0100
如果结果非零,则第 2 位必须已设置;否则未设置。
如果要设置左起第 3 位,则与 0010 执行逻辑或:
1101
0010
---- OR
1111
您可以使用 C 运算符 &&(用于 AND)和 || (对于 OR)来执行这些任务。您将需要自己构建位访问模式(上述示例中的 0100 和 0010)。诀窍是记住最低有效位 (LSB) 计为 1,下一个 LSB 计为 2,然后是 4,依此类推。因此,第 n 个 LSB(从 0 开始)的位访问模式就是 2^ 的值n. 在 C 中计算它的最简单方法是将二进制值 0001(在这个四位示例中)向左移动所需的位数。由于此值在无符号整数类数量中始终等于 1,因此这只是 '1 << n'
例子
unsigned char myVal = 0x65; /* in hex; this is 01100101 in binary. */
/* Q: is the 3-rd least significant bit set (again, the LSB is the 0th bit)? */
unsigned char pattern = 1;
pattern <<= 3; /* Shift pattern left by three places.*/
if(myVal && (char)(1<<3)) {printf("Yes!\n");} /* Perform the test. */
/* Set the most significant bit. */
myVal |= (char)(1<<7);
此示例尚未经过测试,但应用于说明总体思路。