1、用宏定义来完成位运算
1、置位
置位特定位n:#define SET_NTH_BIT(x, n) ( x | ((1U)<<(n-1)) )
置位n到m位:
#define SET_BIT_N_TO_M(x,n,m)(x | (~((~0u)<<(m-n+1)))<<(n-1))
分析:
第一步:( (~0u) <<(m-n+1) ) 运行结果是等到0到(m-n+1)位是0,(m-n+2)到31位是1
第二步:(~((~0u)<<(m-n+1)))将第一步的运行结果按位取反。即0到(m-n+1)位是1,(m-n+2)到31位是0
第三步:(~((~0u)<<(m-n+1)))<<(n-1) 将第二步的32位数向左移动(n-1)位,等到(n-1)到(m-1)位为1,其余为0。
第四步:采用位或,将特定位置为1/
2、复位
复位特定位:#define CLEAR_NTH_BIT(x, n) ( x & ~((1U)<<(n-1)) )
复位n到m位:
#define CLEAR_BIT_N_TO_M(x,n,m) (x & ((~0u)<<(m-n+1))<<(n-1))
3、截取变量的部分连续位
#define GETBITS(x, n, m) ( (x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1) )
版权声明:本文为zwh847021940原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。