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)))

剖析:

  1. 如果n=2, m=5,则就是把bit2~bit5置位
  2. 因此我们需要一个算式来得到(m-n+1)个1:
  3. 算式实现: 先得到32位1: ~0U
  4. 将第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)

相关推荐