原创 位运算.(C)

2008-8-7 23:28 4231 9 9 分类: MCU/ 嵌入式

一直对位运算的印象十分模糊, 闲来翻翻书, 方才恍然大悟.


一. 说明


1. & 按位与
例: (10010011) & (00111101) = (00010001)
即: 相应的位, 做与运算.


2. | 按位或
例: (10010011) | (00111101) = (10111111)
即: 相应的位, 做或运算.


3. ^ 按位异或
例: (10010011) ^ (00111101) = (10101110)
即: 相应的位, 做异或运算.


二. 应用


1. 掩码
令常量MASK = 2(即00000010), 只有1位是非零. 做以下运算:

flags = flags & MASK;

就会使得flag, 除1位不变外, 其他位全部置零.
ac0b4f14-9b9b-4e35-ae70-6fcfd598408e.JPG
图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条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条