嵌入式C之位操作的应用

简介: 嵌入式C之位操作的应用

叙述:

嵌入式位运算是嵌入式系统中常用的优化技巧之一,它可以通过位运算操作来实现一些常见的数学运算、逻辑运算等,从而提高程序的执行效率。

本文就这方面进行介绍。


我个人认为,位操作就是取、删、反、移位、清空、切换等这些,但是在实际中因为对这方面的理解不够透彻,导致在写代码时,不知道怎么操作。

位移运算

位移运算包括左移运算和右移运算,通过将二进制数的位向左或向右移动指定的位数,可以实现快速的乘以或除以2的幂次方操作。例如,将一个整数向左移动3位,相当于将其乘以2的3次方(即8),将一个整数向右移动2位,相当于将其除以2的2次方(即4)。

1int x = 10;  // 声明一个整数变量 x,初始值为 10
2int y = x << 3;  // 将 x 左移 3 位,相当于乘以 8
3int z = x >> 2;  // 将 x 右移 2 位,相当于除以 4

位与运算

位与运算是对两个数的每个二进制位进行逻辑与操作,如果两个相应的二进制位都为1,则该位的结果为1,否则为0。位与运算常用于掩码操作、判断奇偶性等。

1int x = 0x0F;  // 声明一个整数变量 x,初始值为 0x0F(二进制为 0000 1111)
2int y = 0x03;  // 声明一个整数变量 y,初始值为 0x03(二进制为 0000 0011)
3int z = x & y;  // 对 x 和 y 进行位与运算,结果为 0000 0011(十进制为 3)

位或运算

位或运算是对两个数的每个二进制位进行逻辑或操作,如果两个相应的二进制位中至少有一个为1,则该位的结果为1,否则为0。位或运算常用于设置标志位、合并掩码等。

1int x = 0x0F;  // 声明一个整数变量 x,初始值为 0x0F(二进制为 0000 1111)
2int y = 0x03;  // 声明一个整数变量 y,初始值为 0x03(二进制为 0000 0011)
3int z = x | y;  // 对 x 和 y 进行位或运算,结果为 0000 1111(十进制为 15)


位异或运算

位异或运算是对两个数的每个二进制位进行逻辑异或操作,如果两个相应的二进制位不相同,则该位的结果为1,否则为0。位异或运算常用于取反标志位、差分数据传输等。


1int x = 0x0F;  // 声明一个整数变量 x,初始值为 0x0F(二进制为 0000 1111)
2int y = 0x03;  // 声明一个整数变量 y,初始值为 0x03(二进制为 0000 0011)
3int z = x ^ y;  // 对 x 和 y 进行位异或运算,结果为 0000 1100(十进制为 12)

位取反运算

位取反运算是对一个数的每个二进制位进行逻辑取反操作,即将1变为0,0变为1。位取反运算常用于反转标志位、取反掩码等。

1int x = 0x0F;  // 声明一个整数变量 x,初始值为 0x0F(二进制为 0000 1111)
2int y = ~x;  // 对 x 进行位取反运算,结果为 1111 0000(十进制为 -16)

位域操作

位域是一种将一个或多个字段打包到一个单一的机器字中的数据结构。位域可以有效地压缩存储空间,并且可以提高程序的执行效率。位域常用于控制寄存器、状态寄存器等。

1struct {
2    unsigned char a : 4;  // 定义一个 4 位的无符号整数字段 a
3    unsigned char b : 3;  // 定义一个 3 位的无符号整数字段 b
4    unsigned char c : 1;  // 定义一个 1 位的无符号整数字段 c
5} bitfield;
6
7bitfield.a = 5;  // 设置字段 a 的值为 5(二进制为 0101)
8bitfield.b = 2;  // 设置字段 b 的值为 2(二进制为 010)
9bitfield.c = 1;  // 设置字段 c 的值为 1(二进制为 1)

清除位:

可以使用位运算符将特定的位设置为0。例如,如果需要清除一个8位字节的最高位,可以使用以下代码:

1unsigned char byte = 0xFF;
2byte &= 0x7F; // Clear the highest bit


设置位:

可以使用位运算符将特定的位设置为1。例如,如果需要将一个8位字节的第4位设置为1,可以使用以下代码:

1unsigned char byte = 0x00;
2byte |= 0x10; // Set the 4th bit

反转位:

可以使用位运算符将特定的位取反。例如,如果需要反转一个8位字节的所有位,可以使用以下代码:

1unsigned char byte = 0x55;
2byte ^= 0xFF; // Invert all bits


检查位:

可以使用位运算符检查特定的位是否设置为1或0。例如,如果需要检查一个8位字节的第2位是否为1,可以使用以下代码:

1unsigned char byte = 0x04;
2if (byte & 0x02) {
3    // The 2nd bit is set
4} else {
5    // The 2nd bit is not set
6}
相关文章
|
关系型数据库 MySQL 数据库
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
845 0
|
人工智能
IDEA完全免费AI辅助编程插件BITO-GPT4安装及中文国产化设置
IDEA完全免费AI辅助编程插件BITO-GPT4安装及中文国产化设置
2044 1
|
28天前
|
人工智能 机器人 数据处理
ICLR2026 !SAM3重磅来袭:能“听懂人话”的分割模型,性能狂飙2倍
Lab4AI.cn覆盖全周期科研支撑平台,提供论文速递、AI翻译和AI导读工具辅助论文阅读;支持投稿论文复现和Github项目复现,动手复现感兴趣的论文;论文复现完成后,您可基于您的思路和想法,开启论文创新与成果转化。
|
存储 人工智能 分布式计算
2021云栖大会丨阿里云发布第四代神龙架构,提供业界首个大规模弹性RDMA加速能力
10月20日,2021年杭州云栖大会上,阿里云发布第四代神龙架构,升级至全新的eRMDA网络架构,是业界首个大规模弹性RDMA加速能力。
2021云栖大会丨阿里云发布第四代神龙架构,提供业界首个大规模弹性RDMA加速能力
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
八成职场人依赖AI工具下,“职业技能培训”的需求与应对策略
人工智能(AI)正深度重塑职场生态。数据显示,约八成职场人使用AI工具,00后互动频率最高。AI虽提升效率,但也带来技能退化风险。职业技能培训成为关键,如生成式人工智能认证(GAI认证)助力职场人掌握核心技术与应用方法。未来,职业技能培训与AI技术将共生共荣,推动职场人适应变革、实现成长。
|
存储 人工智能 搜索推荐
Memoripy:支持 AI 应用上下文感知的记忆管理 Python 库
Memoripy 是一个 Python 库,用于管理 AI 应用中的上下文感知记忆,支持短期和长期存储,兼容 OpenAI 和 Ollama API。
859 6
Memoripy:支持 AI 应用上下文感知的记忆管理 Python 库
|
存储 安全 Java
20个SpringSecurity框架核心组件源码详解
以上是 V 哥给大家整理的20个Spring Security 中核心组件的分析与运行过程,理解后可助你玩转Spring Security,如果文章对你有帮助,客官请点赞收藏转发给更多需要的兄弟,任何疑问请评论区与V哥交流。
278 0
|
存储 缓存 监控
JVM中G1垃圾收集器:原理、过程和参数配置深入解析
JVM中G1垃圾收集器:原理、过程和参数配置深入解析
|
域名解析 缓存 网络协议
Python中使用`requests`库连接池与性能优化技术
【4月更文挑战第12天】在Python的网络编程中,`requests`库因其简洁易用的API和强大的功能而备受欢迎。然而,在高并发或大量请求的场景下,直接使用`requests`发送请求可能会导致性能瓶颈。为了解决这个问题,我们可以利用`requests`库提供的连接池(Connection Pooling)机制,以及采取一些性能优化措施,来提升请求的处理效率和稳定性。
1485 1
|
存储 安全 程序员
嵌入式C之堆和栈
嵌入式C之堆和栈