先写总结:
a |= 1<<x //第x位置1
a &=~(1<<x) //第x位置0
(a &(1<<x)) == a //判断该位是否为1,注意等号左边括号不能省略
(a& (1<<x))==0 //判断该位是否为0
a>>n //除法 a/ 2^n 右移相当于除以2的几次方
a<<n //乘法 a*2^n 左移相当于乘以2的几次方
1、基础知识
(1)位与& 逻辑与&&
1&1=1 1&0=0 0&0=0 0&1=0
(2)位或 | 逻辑或 ||
1|1=1 1|0=1 0|0=0 0|1=1
(3)位取反~ 逻辑取反 !
(4)位异或 ^
不同为1,相同为0
1^1=0 1^0=1 0^0=0 0^1=1
5)移位操作
C语言的移位要取决于数据类型
左移位 << 右移位 >>
-
无符号数, 逻辑移位
左移位时右侧补0
右移位时左侧补0
-
有符号数, 算数移位
左移位时右侧补0(相当于逻辑移位)
右移位时左侧补符号位,如果是正数就补0,负数就补1(第一位为符号位,0为正,1为负)
二、寄存器的赋值操作方法
为说明方便,定义寄存器A/B:
-
如果只操作其中某一位
A &= ~(1<<x) //将x位置0
B | = (1<<x) //将x位置1
-
如果一下置位多个位,下面的方法可以用
A &=~0001 1100 //第2-4置0
B | =0001 1100 //第2-4位置1
还可以这样操作:
A &=~((1<<2) | (1<<3) | (1<<4)) //将2-4置0B|=(1<<2) | (1<<3) | (1<<4) //将2-4置1
-
如何判断寄存器某一位是0还是1。寄存器底层操作中,时常用到判断某个寄存器的状态,即读入某个寄存器的值。
A & (1<<x) //与操作,如果相应位是0,则结果是0,如果相应位是1,则结果是1.
B | (0<<x) //或操作,如果相应位是0,则结果是0,如果相应位是1,则结果是1.