C语言位操作
1 位操作运算符
1.1、与 (&)、或(|)、按位取反(~)
1.2、移位操作:左移(<<)、右移(>>)
2 位操作宏函数
2.1 bit n位置位,即bit n 置1其他位保持不变(从bit 0开始,如 0x01 bit 0为1)
#define SET_NTH_BIT(x,n) (x | (1U << n))
其中,1U 表示无符号整数1,左移n为得到bit n位为1,即掩码,与x按位或即可把x bit n置为1
2.2 bit n 位清零
#define CLEAR_NTH_BIT(x,n) (x & ~(1U << n))
其中,1U 表示无符号整数1,左移n为得到bit n位为1,即掩码,然后按位取反除bit n外所有位为1,与x按位与即可把x bit n清零
2.3 读取bit n位状态
#define GET_NTH_BIT(x,n) (x & (1U << n))
其中,1U 表示无符号整数1,左移n为得到bit n位为1,即掩码,与x按位与即可读取x 中 bit n的状态,因为 1&0 = 0,1&1 = 1,x中bit n位为1相与结果为1,反之为0.
2.4 读取bit n到bit m之间的连续位,其中 m > n
Step 1: 获得(m-n+1)个连续位为0的数,无符号整数左移和右移空缺的位补0,然后按位取反
~(0U) << (m-n+1)
其中,~(0U)得到全为1的数,然后<<(m-n+1)位,得到(m-n+1)位为0,其他位为1
Step 2: 按位取反得到(m-n+1)个连续位为1的数
~(~(0U) << (m-n+1) )
Step 3: << n位获得 bit n 到 bit m之间连续位为1的数
(~(~(0U) << (m-n+1) ))<< n
Step 4: 与某一个数x按位与(&),得到x的bit n 到 bit m之间位
x & ((~(~(0U) << (m-n+1) ))<< n)
Step 5: 得到x的bit n 到 bit m之间位,然后>>n得到x的bit n 到 bit m之间位对应的数
( (x & ((~(~(0U) << (m-n+1) ))<< n))>> n)
宏定义函数为:
#define GETBITS(x,n,m) ( (x & ((~(~(0U) << (m-n+1) ))<< n))>> n)