C语言位操作(自用)

一.位操作符

1.1.位与&(有0出0,全1出1)(0xAA&0xF0=0xA0)
逻辑与&&(0xAA && 0xF0=1)
1.2.位或|(有1出1,全0出0)
逻辑或||
1.3.位取反~
逻辑取反!
1.4.位异或^(相异出1,相同出0)
1.5左移位<< 与右移位>>
C语言的移位要取决于数据类型。
对于无符号数,左移时右侧补0(相当于逻辑移位)
对于无符号数,右移时左侧补0(相当于逻辑移位)
对于有符号数,左移时右侧补0(叫算术移位,相当于逻辑移位)
对于有符号数,右移时左侧补符号位(如果正数就补0,负数就补1,叫算术移位)
嵌入式中研究的移位,以及使用的移位都是无符号数

二.位与位或位异或在操作寄存器时的特殊作用

特定位清零用 &

特定位置1用 |

特定位取反用 ^

例:

用C语言给一个寄存器的bit7~bit17赋值937(其余位不受影响)。
关键点:第一,不能影响其他位;第二,你并不知道原来bit7~bit17中装的值。
思路:第一步,先将bit7~bit17全部清零,当然不能影响其他位。
第二步,再将937写入bit7~bit17即可,当然不能影响其他位。
a &= ~(0x7ff<<7);
a |= (937<<7);

三、用宏定义来完成位运算

置位第n位

//置位第n位
#define SET_BIT_N(x, n)			(x | (1u<<(n-1)))

复位第n位

//复位第n位
#define CLEAR_BIT_N(X, n)		(X & (~(1u<<(n-1))))

置位bitn-bitm位

//置位bitn-bitm位
#define SET_BIT_N_M(x, n, m)	(x | ((~(~0u<<(m-n)))<<(n-1)))

截取变量的部分连续位

#define GETBITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1)) 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值