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

按位运算 - C++

按位运算

  • 1. 多状态/属性“打包”到一个字节里
    • 读某个位
    • 写某个位
    • 第 loc 位设置成 val(0 或 1),其他位保持不变。
    • 第 loc 位是不是 1
    • 翻转某个位
  • 2. 多个小量合并进一个字节或整数(节省通信)
  • 3. 利用掩码管理多路开关/多通道
  • 4. 快速判断奇偶性
  • 5. 只保留低N位/高N位
  • 6. 按位轮询查找第一个有效位
  • 7. 多功能复用,动态切换
  • 8. 条件组合批量操作
    • 批量置位
    • 批量清零
  • 9. 校验/掩码设计(协议)
  • 10. 轻量状态机或权限表设计
  • 11. 多状态一次判断/多条件快速统计
  • 12. 高级技巧:循环左移/右移,构造循环状态
  • 总结

1. 多状态/属性“打包”到一个字节里

思路
用每个位表示一种状态(或属性),单字节/多字节可以表达2ⁿ种组合,比数组/结构体节省内存、传输方便。

例子:打包关节/电机/传感器状态

uint8_t status = 0;
// bit 0: 使能
// bit 1: 错误
// bit 2: 电机方向
// bit 3: 手动模式
// ... 其余位自由定义

读某个位

bool is_enabled = (status & (1<<0)) != 0; // 检查bit0

写某个位

// 置1
status |= (1<<1); // 设为错误
// 置0
status &= ~(1<<1); // 清除错误

第 loc 位设置成 val(0 或 1),其他位保持不变。

uint8_t update_bit(uint8_t original, bool val, uint8_t loc)
{uint8_t keep_bit = ~(1<<loc);  // 设置掩码,除了第 loc 位都为1return (original & keep_bit) | (val<<loc); // 清掉loc位,按val补上
}
  1. 生成掩码
    • (1<<loc) :第 loc 位为1,其余为0
    • ~(1<<loc) :第 loc 位为0,其余为1(比如 loc=3,则掩码是 11110111)
  2. 清除原数据第 loc 位
    • original & keep_bit :把第 loc 位清零,其他位不变
  3. 把 val 写入第 loc 位
    • val<<loc :把 0/1 挪到正确的位置
  4. 两者相加(或|操作)
    • 这样最终结果:只有 loc 位是 val,其他都和 original 相同

第 loc 位是不是 1

bool get_bit(uint8_t original, uint8_t loc)
{uint8_t bit_to_check = (1<<loc); // 构造一个第loc位为1的掩码return (original & bit_to_check) == bit_to_check; // 按位与,判断那一位是不是1
}
  • 1<<loc:把 1 左移 loc 位,只保留你要检查的那一位,其余是0
  • original & bit_to_check:把其他位都抹掉,只剩下感兴趣的那一位
  • 比较结果是不是等于 bit_to_check,为真则原本那一位就是1,否则是0

翻转某个位

status ^= (1<<2); // 切换方向

2. 多个小量合并进一个字节或整数(节省通信)

例子:
把两个 4 位的小量合成一个 8 位字节

uint8_t high_nibble = (a & 0x0F) << 4;
uint8_t low_nibble  = (b & 0x0F);
uint8_t packed = high_nibble | low_nibble;

还原

uint8_t a = (packed >> 4) & 0x0F;
uint8_t b = packed & 0x0F;

更多位宽

  • 10 位 + 6 位合成 16 位

  • 5 个 3 位数据合成 16 位(高效打包)

3. 利用掩码管理多路开关/多通道

比如 8 个舵机、LED 灯、传感器:

uint8_t channel_mask = 0b10101100; // 表示哪些通道开/关for (int i=0; i<8; i++) {if (channel_mask & (1<<i)) {// 开第i路} else {// 关第i路}
}

一行代码处理所有通道的状态,非常高效!

4. 快速判断奇偶性

bool is_even = ((val & 1) == 0);
bool is_odd  = ((val & 1) == 1);

不用除法取模,运算极快!

5. 只保留低N位/高N位

只取低4位

uint8_t lower_4 = val & 0x0F;

只取高4位

uint8_t upper_4 = (val & 0xF0) >> 4;

6. 按位轮询查找第一个有效位

比如找到第一个出错的传感器:

uint8_t error_mask = 0b01011000;
for (int i=0; i<8; i++) {if (error_mask & (1<<i)) {// 第i个传感器出错,优先级最高break;}
}

7. 多功能复用,动态切换

用一字节高4位表示类型,低4位表示子类型/状态

uint8_t id = (type << 4) | subtype;

拆分:

uint8_t type    = (id >> 4) & 0x0F;
uint8_t subtype = id & 0x0F;

8. 条件组合批量操作

批量置位

status |= (1<<1) | (1<<3) | (1<<5); // 一次性置多位

批量清零

status &= ~((1<<1) | (1<<3) | (1<<5));

9. 校验/掩码设计(协议)

数据有效位+奇偶校验+预留位混合打包,通讯协议里常见。

10. 轻量状态机或权限表设计

比如用一字节管理多个权限(读、写、执行、调试)

enum Access {ACCESS_READ    = 1 << 0,ACCESS_WRITE   = 1 << 1,ACCESS_EXECUTE = 1 << 2,ACCESS_DEBUG   = 1 << 3,
};uint8_t user_perm = ACCESS_READ | ACCESS_EXECUTE;
if (user_perm & ACCESS_WRITE) { ... }

11. 多状态一次判断/多条件快速统计

判断有多少路为1(统计 set bit 数)

int count = 0;
uint8_t val = 0b10110101;
for (int i=0; i<8; i++) count += (val>>i)&1;
// 更快的算法也有,比如Kernighan方法

12. 高级技巧:循环左移/右移,构造循环状态

// 循环左移
uint8_t val = 0b10010011;
val = (val << 1) | (val >> 7); // 循环左移一位

总结

这些技巧的核心思想就是:

  • 每一位当做一个独立的开关/状态/属性
  • 批量管理,批量判断,批量修改,省空间省代码量
  • 通信协议、状态机、错误检测、权限系统,全部都能用上
http://www.dtcms.com/a/316562.html

相关文章:

  • Velero 简介和部署
  • Linux进程信号——初步认识信号、信号的产生
  • 《UE教程》第一章第六回——迁移独立项目(资源)
  • IAR软件中变量监控的几种方法
  • 如何在 FastAPI 中优雅处理后台任务异常并实现智能重试?
  • Wireshark安装过程 Npcap Setup: Failed to create the npcap service: 0x8007007e.
  • 信息系统项目管理中的沟通管理实战精解
  • 智慧能源场景设备缺陷漏检率↓76%:陌讯多模态融合检测方案实战解析
  • SpringCloud学习------Gateway详解
  • Claude Code 完整指南:入门到应用
  • Qt事件系统学习笔记
  • 嵌入式软件架构设计之七:双机通信及通信协议之字符串协议
  • 大语言模型安全攻防:从提示词注入到模型窃取的全面防御浅谈
  • 与功能包相关的指令ros2 pkg
  • 女性成长赛道:现状与发展趋势|创客匠人
  • NumPy 中的取整函数
  • 如何在Android设备上删除多个联系人(3种方法)
  • Java项目:基于SSM框架实现的公益网站管理系统【ssm+B/S架构+源码+数据库+毕业论文+答辩PPT+远程部署】
  • 解锁高效敏捷:2025年Scrum项目管理工具的核心应用解析
  • 智慧社区物业管理平台登录流程全解析:从验证码到JWT认证
  • 关于熵减 - 双线线圈
  • 前端性能测试:从工具到实战全解析
  • 类内部方法调用,自注入避免AOP失效
  • Flutter 国际化
  • OpenSpeedy绿色免费版下载,提升下载速度,网盘下载速度等游戏变速工具
  • spring boot 加载失败 异常没有曝漏出来
  • 基于Java AI(人工智能)生成末日题材的实践
  • 2. JS 有哪些数据类型
  • 【网络运维】Linux:系统启动原理与配置
  • 虚幻GAS底层原理解剖一(开篇)