4.2.6.技术升级:用宏定义来完成位运算

本文详细介绍了如何使用宏定义来进行位操作,包括设置特定位、清除特定位以及获取变量中指定范围内的位值等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4.2.6.1、直接用宏来置位、复位(最右边为第1位)。 


#define SET_NTH_BIT(x, n)  (x | ((1U)<<(n-1)))
#define CLEAR_NTH_BIT(x, n) (x & ~((1U)<<(n-1)))

4.2.6.2、截取变量的部分连续位。例如:变量0x88, 也就是10001000b,若截取第2~4位,则值为:100b = 4 
#define GETBITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1)) 
分析:这个题目相当于我们4.2.4.5中做的事情,只不过要用宏来实现。
这个题目相当于是要把x的bit(n-1)到bit(m-1)取出来
复杂宏怎么分析:


((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1))
第一步,先分清楚这个复杂宏分为几部分:2部分
(x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1)
分析为什么要>>(n-1),相当于是我们4.2.4.5中的第二步


第二步,继续解析剩下的:又分为2部分
x & ~(~(0U)<<(m-n+1))<<(n-1)
分析为什么要&,相当于我们4.2.4.5中的第一步


第三步,继续分析剩下的:
~ (~(0U)<<(m-n+1))<< (n-1) 
这个分析时要搞清楚第2坨到底应该先左边取反再右边<<还是先右边<<再左边取反。
解法:第一,查C语言优先级表;第二,自己实际写个代码测试。
说明这个式子应该是 ~(~(0U)<<(m-n+1))<< (n-1) ,这就又分为2部分了


10001000
00001110
00001000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值