C语言学习篇(9)位操作(三)
https://m.toutiao.com/is/Jben8H9/
在很多开源项目中都会使用宏定义的方式实现一些特定的位运算,以及在一些面试过程中,都会涉及分析其工作原理,因此这节来拓展下宏定义实现位运算的知识。
宏定义实现第n位置位
#define SET_BIT_N(x, n) (x | (1U<<(n)))
代码验证:
宏定义实现置位
宏定义实现第n位清零
#define CLEAR_BIT_N(x, n)(x & ~(1U<<(n)))
代码验证:
宏定义实现清零
难度加大: 宏定义实现第n位到第m位置位
#define SET_BIT_N_M(x, n, m)(x | (((~0U)>>(32-(m-n+1)))<<(n)))
剖析:
- 如果n=2, m=5,则就是把bit2~bit5置位
- 因此我们需要一个算式来得到(m-n+1)个1:
- 算式实现: 先得到32位1: ~0U
- 将第3)得到的数,右移(32-(m-n+1))位就得到了低(m-n+1)全为1,其他高位为0的数
(~0U)>>(32-(m-n+1))
5. 之后并左移n位后位与(|)操作
代码验证:
宏定义实现多位置位
截取变量的部分连续位
#define GET_BITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n)) >> (n))
代码验证:
获取连续位
总结
赞 (0)