位运算

1.特定位置1用 "|"

2.特定位取反用 "^"
(任何数,其实就是1或者0)与1位异或会取反,与0位异或无变化操作手法和刚才讲的位与是类似的。
3.特定位清零用 "&"

例1:写一个宏将a的bit2置位

  通用:#define  SETBIT(a, n)      (a  |  (  (1U)  <<  n ) )

       #define SETABIT2  (a  | ((1U) << 2))

例2:截取变量的部分连续位,把第n到第m位取出来

  变量0x88, 也就是10001000b,若截取第2~4位,则值为:100b = 4

  #define GETBITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1))

这个题目相当于是要把x的bit(n-1)到bit(m-1)取出来
复杂宏怎么分析:
1.~(0U)<<(m-n+1)
0取反得到0xffff ffff,然后从n到m一共有m-n+1个1,左移这么多位
2.~(~(0U)<<(m-n+1))
再取反,就得到了m-n+1个1
3.~(~(0U)<<(m-n+1))<<(n-1)
再左移n-1个位,就使得n-m位为1
4.x & ~(~(0U)<<(m-n+1))<<(n-1)
然后与x相与,得到n-m位的值,其他位置0,然后再右移n-1位即得到n-m位的值
其实主要是为了得到n-m位的值,得到这个值后再右移n-1个位就可以了

原文地址:https://www.cnblogs.com/Deanboy/p/7530568.html