寄存器常见的清零和置一操作,使用到的是&=和|=,以及二进制的左移(<<)和右移(>>)
目录
移位
移位分为左移和右移,这是对二进制的位进行操作
例如,0b0001 << 1 = 0b0010; 1左移1位,得到0b10,转化为十进制后是2
二进制位操作中左移1位,相当于十进制数乘以2
同理,右移0b0100 >> 2 = 0b0001; 0b0100右移两位得到0b0001,
右移1位相当于十进制数除以2
清零
通常需要在不改变其他位的状态下,将寄存器的某一位清零,显然,这时候直接赋值给寄存器是不行的,就需要用到&=
首先,在逻辑运算中,1&1=1,1&0=0,0&0=0
由运算规律可以得出,任何数与1都得到它本身,任何数与0都得0;
假定定义一个int型变量a,让a初始值为0xA0
int a = 0xA0; //0xA0 = 10;
则a二进制表示成0B1010 0000 (0B表示二进制)
如果要将a的第7位清零并保证其他位数据不变,a & 0B0111 1111 = 0B0010 0000,再将其赋值给a即可
而0B0111 1111可以写成0B1000 0000的取反,0B1000 0000则是1<<7
故想要将a的第7位清零可以这么操作:
a = (a & ~(1<<7));
a &= ~(1<<7);
这两句在C语言中是等效的
置一
同理,想要将某一位置1,并保证其他位数据不被改变,直接赋值是不行的
在逻辑运算中1|1=1,1|0=0,0|0=0 其中|是或运算的符号
可以让想要置一的那一位或上一个1,其他位都或0,由运算规律可以得到,任何数或0都得到它本身,任何数或1都得到1
如果想要让a的第7位置一可以这么操作:
a = (a | 1<<7);
a |= 1<<7;
这两句代码在C语言中是等小的
读位
清零和置一可以让某一位变成想要的数值,如果想要读出某一位的值,则需要用到&运算
假定a = 0xA0; //二进制表示为0b1010 0000;
如果想要读取第7位并保存到b中,则可以这样写:
a = 0xA0;
b = ( a&(1<<7) ) >> 7;
让a&0b1000 0000,如果第7位是1则得到0b1000 0000,再将其右移7位得到0b1,保存到b中
如果第7位是0,则得到0,右移7位后还是0,保存到b中
通过&操作就可以读取某一位的数值
注:如果不将与运算的结果右移7位也是可以的,这样b要么等于0b1000 0000,要么等于0,直接放到if或while等条件判断中也是可以的,条件表达式中只要是不等于0都认为是条件成立