二进制基础和STM32的常用位运算
目录
一、引言
二、二进制基础
1.二进制的表示
2.二进制的优势
3.二进制与十进制的转换
三、位运算基础
1.按位与(&)
2.按位或(|)
3.按位异或(^)
4.按位取反(~)
5.左移(<<)
6.右移(>>)
四、STM32的常用位运算
1.清 0 操作
2.置 1 操作
五、实际应用场景
六、注意事项
一、引言
在计算机科学中,二进制和位运算是非常基础且重要的概念。它们在底层编程、优化算法、数据压缩等方面都有着广泛的应用。本文将深入介绍二进制的基本概念以及常用的位运算操作。
二、二进制基础
1.二进制的表示
二进制是一种计数系统,只使用两个数字:0 和 1。每一位(bit)的值代表 2 的幂次方。例如,二进制数 1010 可以表示为:
2.二进制的优势
计算机内部使用二进制来存储和处理数据,主要是因为二进制在物理实现上更加简单可靠。电子元件可以很容易地表示两种状态(如高电平和低电平、导通和截止等),对应于二进制的 0 和 1。
3.二进制与十进制的转换
十进制转换为二进制可以通过不断除以 2 取余数的方法得到。例如,将十进制数 13 转换为二进制:
13÷2=6 余1 6÷2=3 余0 3÷2=1 余1 1÷2=0 余1
从下往上读取余数得到二进制数 1101
二进制转换为十进制则是将每一位的数字乘以对应的 2 的幂次方后相加。
三、位运算基础
1.按位与(&)
- 按位与操作对两个操作数的每一位进行逻辑与运算。只有当两个相应位都为 1 时,结果位才为 1,否则为 0。
- 例如,二进制数 1010 & 1100 = 1000。
- 应用场景:可以用于提取特定的位、判断奇偶性等。例如,判断一个数是否为偶数,可以使用与运算判断最低位是否为 0。
2.按位或(|)
- 按位或操作对两个操作数的每一位进行逻辑或运算。只要两个相应位中有一个为 1,结果位就为 1。
- 例如,二进制数 1010 | 1100 = 1110。
- 应用场景:可以用于设置特定的位、合并标志位等。
3.按位异或(^)
- 按位异或操作对两个操作数的每一位进行逻辑异或运算。当两个相应位不同时,结果位为 1,否则为 0。
- 例如,二进制数 1010 ^ 1100 = 0110。
- 应用场景:可以用于简单的加密、交换两个变量的值而无需使用临时变量等。
4.按位取反(~)
- 按位取反操作对一个操作数的每一位进行逻辑取反。将 0 变为 1,将 1 变为 0。
- 例如,~1010 = 0101。
5.左移(<<)
- 左移操作将一个二进制数的所有位向左移动指定的位数。左边移出的位被丢弃,右边用 0 填充。
- 例如,1010 << 2 = 101000。
- 应用场景:可以用于快速乘以 2 的幂次方。
6.右移(>>)
- 右移操作将一个二进制数的所有位向右移动指定的位数。对于无符号数,左边用 0 填充;对于有符号数,根据符号位进行填充(正数用 0 填充,负数用 1 填充)。
- 例如,1010 >> 2 = 0010。
- 应用场景:可以用于快速除以 2 的幂次方。
四、STM32的常用位运算
1.清 0 操作
假设我们有一个寄存器,其中某些位需要被清零。可以使用按位与操作结合特定的掩码来实现。
例如,有一个 32 位的寄存器变量 reg
,要将其第 5 位清零,可以这样做:
reg &= ~(1 << 5);
解释:
1 << 5
将数字 1 左移 5 位,得到一个只有第 5 位为 1,其他位为 0 的数。~(1 << 5)
对这个数取反,得到一个只有第 5 位为 0,其他位为 1 的掩码。reg &= ~(1 << 5)
让reg
与这个掩码进行按位与操作,这样就将reg
的第 5 位清零,而其他位保持不变。
2.置 1 操作
如果要将寄存器的某些位设置为 1,可以使用按位或操作。
例如,要将 reg
的第 3 位置 1,可以这样做:
reg |= (1 << 3);
解释:
1 << 3
将数字 1 左移 3 位,得到一个只有第 3 位为 1,其他位为 0 的数。reg |= (1 << 3)
让reg
与这个数进行按位或操作,这样就将reg
的第 3 位置为 1,而其他位保持不变。
五、实际应用场景
1.配置 GPIO 引脚:
- 在 STM32 中,配置 GPIO 引脚的模式、速度等属性时,常常需要对特定的寄存器位进行操作。
- 例如,设置某个 GPIO 引脚为输出模式,可以通过设置相应寄存器的特定位来实现。
2.控制外设功能:
- 对于一些外设寄存器,通过位运算可以方便地开启或关闭特定的功能。
- 比如,使能或禁用某个定时器的特定功能,可以通过设置相应寄存器的特定位来完成。
六、注意事项
1.理解寄存器的位定义:
- 在进行位运算操作之前,必须清楚了解所操作的寄存器的每一位的含义和作用。
- 参考 STM32 的参考手册,确保正确地操作寄存器的特定位。
2.避免意外影响其他位:
- 在进行位运算时,要小心操作,确保只影响目标位,而不会意外改变其他不需要改变的位。
- 可以先读取寄存器的值,进行位运算后再写回寄存器,以确保其他位不受影响。