一、直接用宏来置位、复位(最右边为第1位)
1)用宏定义将32位数X的第n位(右边起算,也就是bit0算第1位)置位
#define SET_BIT_N(x,n) (x | (1U << (n-1))) //1U:表示1是无符号数的1
2)用宏定义将32位数x的第n位(右边起算,也就是bit0算第1位)清零
#define CLEAR_BIT_N(x,n) (x & ~(1U << (n-1)))
3)用宏定义将32位数X的第n位到第m位(右边起算,也就是bit0算第1位,m是高位)置位
//分析:加入n=3,m=6,题目就是将x的第3位到第6位置1
//算法:
1)得到32为1:~0U
2)将第一步得到的数右移x位得到(m-n+1)个1(~0U)>>(32-(m-n+1))
#define SET_BIT_N_M(x,n,m) (x | ( (~0U)>> (32- (m-n+1) ) ) <<(n-1))
二、.截取变量的部分连续位。
例如:变量0x 4)截取变量x的第n位到第m位
#define GETBITS(x,n,m) ( ( x &~(~(0U)<<(m-n+1) ) ) >> (n-1) )
分析:~(~(0U)<<(m-n+1))为m-n+1位都为1其余为0,就是保留m-n+1位,其余位置0.另外这里没有用到32表示,
这个宏适用于所有32位和64位系统,有更好的扩展性 ~ (~(0U))<<(m-n+1) ) << (n-1)
这个分析时要搞清除~与<<谁的优先级最高
第一种方法:查询手册得知,~的优先级高于<<
第二种方法:写代码调试