Q如何操作单个位?
A在 C 语言中,位操作非常直接且常用。要提取(测试)一个位,可以使用按位 AND(&)运算符,并配合一个表示你感兴趣的位(或位组)的位掩码。
value & 0x04要设置一个位,请使用按位 OR(|或|=)运算符。
value |= 0x04要清除一个位,请使用按位补码(~)和按位 AND(&或&=)运算符。
value &= ~0x04(前面三个示例都操作的是第三个最低有效位,即 2**2 位,表示为常量位掩码0x04.)
要操作任意一个位,请使用左移(<<)运算符来生成你需要的掩码。
value & (1 << bitnumber) value |= (1 << bitnumber) value &= ~(1 << bitnumber)或者,你也可以预先计算一个掩码数组。
unsigned int masks[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; value & masks[bitnumber] value |= masks[bitnumber] value &= ~masks[bitnumber]
为了避免符号位带来的意外情况,在操作位和字节的代码中,通常最好使用无符号整型。
参考文献:K&R1 第 2.9 节,第 44-45 页
K&R2 第 2.9 节,第 48-49 页
ISO 第 6.3.3.3 节、第 6.3.7 节、第 6.3.10 节、第 6.3.12 节
H&S 第 7.5.5 节,第 197 页;第 7.6.3 节,第 205-206 页;第 7.6.6 节,第 210 页