当前位置: 首页 > article >正文

二进制基础和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.避免意外影响其他位:

  • 在进行位运算时,要小心操作,确保只影响目标位,而不会意外改变其他不需要改变的位。
  • 可以先读取寄存器的值,进行位运算后再写回寄存器,以确保其他位不受影响。

http://www.kler.cn/a/292360.html

相关文章:

  • flink cdc 应用
  • 使用热冻结数据层生命周期优化在 Elastic Cloud 中存储日志的成本
  • sql在按照当前表查询返回
  • 基于node一键发布到服务器的js脚本
  • 【PHP】ThinkPHP基础
  • 探索Python的HTTP利器:Requests库的神秘面纱
  • YOLOv8 classify介绍
  • JavaScript - Api学习 Day03 (日期对象、节点操作、两种定时器、本地存储)
  • Mysql中的隐式COMMIT以及Savepoints的作用以及MySQL的Innodb分空间存储、设计优化、索引等几个小知识点整理
  • 鸿蒙OS创新实践:动态声控话筒开发指南
  • Anthropic发布Claude企业计划 对标OpenAI的ChatGPT Enterprise
  • 【Python百日进阶-Web开发-音频】Day708 - 时域处理 librosa.lpc
  • k8s执行crictl images报错
  • 代码随想录训练营 Day51打卡 图论part02 99. 岛屿数量 100. 岛屿的最大面积
  • 利用全核范数去噪技术优化彩色图像处理
  • llamafactory微调llama3.1
  • 2024 数学建模高教社杯 国赛(A题)| “板凳龙”舞龙队 | 建模秘籍文章代码思路大全
  • 本地 springboot 项目如何使用 https 进行访问
  • Java项目:141 springboot大学生智能消费记账系统的设计与实现
  • 拥抱分布式云:云基础设施的下个新时代
  • 目标检测-YOLOv1
  • IDEA运行Java程序提示“java: 警告: 源发行版 11 需要目标发行版 11”
  • java项目热部署
  • 蚂蚁SEO|AI养站程序是什么|蚂蚁蜘蛛池
  • 职场关系课:职场上的基本原则(安全原则、进步原则、收益原则、逃生舱原则)
  • 【Godot4.3】CanvasShape资源化改造