一直对位运算的印象十分模糊, 闲来翻翻书, 方才恍然大悟.
一. 说明
1. & 按位与
例: (10010011) & (00111101) = (00010001)
即: 相应的位, 做与运算.
2. | 按位或
例: (10010011) | (00111101) = (10111111)
即: 相应的位, 做或运算.
3. ^ 按位异或
例: (10010011) ^ (00111101) = (10101110)
即: 相应的位, 做异或运算.
二. 应用
1. 掩码
令常量MASK = 2(即00000010), 只有1位是非零. 做以下运算:
flags = flags & MASK;
就会使得flag, 除1位不变外, 其他位全部置零.
图1. 掩码
2. 打开某些位
做以下运算:
flags = flags | MASK;
flag的1位被置一, 其他位均不变.
3. 关闭某些位
做以下运算:
flags = flags & ~MASK;
因为MASk除了1位外都是零, 所以~MASK除了1位外都是1.
于是, 除了1位被置零, 其他位均不变.
4. 位翻转
做以下运算:
flag = flag ^ MASK;
因为 1 ^ 1 = 0; 1 ^ 0 = 1; 0 ^ flag = flag;
所以可以说: ^ 1, 就翻转; ^ 0, 保持;
5. 检验某位上的值
例如: 检验flag的1位是不是被置一.
if (flag == MASK)
puts("Wow!"); /* 结果不正确 */
因为即使flag的1位被置一, 其他位上的值也会使该对比运算出错.
妥当的做法, 先对flag做掩码运算, 在进行对比运算.
if ((flag & MASK) == MASK)
puts("Wow!");
三. 参考资料
Stephen Prata, C Primer Plus 5th Edition
文章评论(0条评论)
登录后参与讨论