STM32F103学习笔记(2.1)——寄存器清零和置一操作详解

寄存器常见的清零和置一操作,使用到的是&=和|=,以及二进制的左移(<<)和右移(>>)

目录

移位

清零

置一

读位


移位

移位分为左移和右移,这是对二进制的位进行操作

例如,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都认为是条件成立

物联沃分享整理
物联沃-IOTWORD物联网 » STM32F103学习笔记(2.1)——寄存器清零和置一操作详解

发表评论