用宏定义来完成运算(本文来自百度文库)

本文详细介绍如何使用宏定义进行位操作,包括位的设置、清除及截取等实用技巧,并提供了具体的实现代码。

一、直接用宏来置位、复位(最右边为第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) 

这个分析时要搞清除~与<<谁的优先级最高 

第一种方法:查询手册得知,~的优先级高于<< 

第二种方法:写代码调试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值