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

【C++】(以及大多数编程语言)中常见的 六种基本位运算操作

在位运算(bitwise operations)中,按位与(& 是基础操作之一,它通常和另外几种位运算操作 并列使用,共同构成底层数据处理、硬件控制、压缩编码等场景的核心工具。

以下是 C/C++(以及大多数编程语言)中常见的 六种基本位运算操作,它们地位相当,常配合使用:

 1. 按位与(Bitwise AND) — &

  • 作用:对两个操作数的每一位执行逻辑“与”。
  • 用途
    • 掩码(masking):提取特定位
    • 清零某些位(用 0 掩掉)
  • 示例
x & 0x01   // 检查最低位是否为1
x & 0xFE   // 清除最低位(保留高7位)

 2. 按位或(Bitwise OR) — |

  • 作用:对每一位执行逻辑“或”。
  • 用途
    • 设置(置1)某些位
    • 合并多个标志位
  • 示例
x | 0x01   // 强制最低位置1
flags = ERR_FLAG | TIMEOUT_FLAG; // 组合多个状态标志

3. 按位异或(Bitwise XOR) — ^

  • 作用:相同为0,不同为1。
  • 用途
    • 翻转特定位(toggle)
    • 加密/校验(如简单异或加密)
    • 交换两个变量(不用临时变量)
  • 示例
x ^= 0x01   // 翻转最低位(0变1,1变0)
a ^= b; b ^= a; a ^= b; // 交换a和b(不推荐实际使用,仅演示)

4. 按位取反(Bitwise NOT) — ~

  • 作用:对一个操作数的所有位取反(0变1,1变0)。
  • 用途
    • 构造掩码
    • 清除某一位(配合 & 使用)
  • 示例
x & ~0x01   // 清除最低位(等价于 x &= 0xFE)
mask = ~0xF0 // 得到 0x0F(低4位为1)

5. 左移(Left Shift) — <<

  • 作用:将所有位向左移动,右侧补0。
  • 用途
    • 快速乘以 2ⁿ
    • 构造位掩码(如 1 << 3 得到 0b00001000
    • 将数据放到指定位置
  • 示例
1 << 3      // 结果是 8 (0b1000)
reg |= (1 << ENABLE_BIT); // 设置第 ENABLE_BIT 位

6. 右移(Right Shift) — >>

  • 作用:将所有位向右移动。
    • 对 无符号数:逻辑右移(高位补0)
    • 对 有符号数:可能是算术右移(高位补符号位,依赖编译器)
  • 用途
    • 快速除以 2ⁿ(整数除法)
    • 提取高位数据(如你之前问的 m.data[5] >> 6
  • 示例
x >> 2      // 相当于 x / 4(向下取整)
(byte >> 4) & 0x0F // 提取高4位

 常见组合技巧(实战)

目标表达式
设置第 n 位`x
清除第 n 位x &= ~(1 << n)
翻转第 n 位x ^= (1 << n)
检查第 n 位是否为1(x >> n) & 1 或 (x & (1 << n)) != 0
提取低4位x & 0x0F
提取高4位(x >> 4) & 0x0F

为什么位运算性能高?

1. 硬件直接支持

  • 所有现代 CPU 都有专门的 ALU(算术逻辑单元) 指令来执行位运算。
  • 这些操作通常只需 1 个 CPU 周期(甚至更少),比加减法还快或相当。
  • 相比之下,除法、取模、浮点运算可能需要几十甚至上百周期。

2. 无分支(branch-free)

  • 位运算不涉及条件跳转(如 if),避免了 分支预测失败(branch misprediction) 的性能惩罚。
  • 在高频循环或实时系统中,这点至关重要。

3. 内存友好

  • 用 1 个 bit 表示布尔状态,8 个状态可压缩到 1 字节,减少内存占用和缓存压力。
  • 更少的内存访问 = 更高的缓存命中率 = 更快的程序。

 

总结

按位与(& 并列的核心位运算包括:

|(或)、^(异或)、~(非)、<<(左移)、>>(右移)

这六种操作构成了位级编程的基石,广泛应用于:

  • 嵌入式系统(寄存器配置)
  • 网络协议解析(标志位、字段提取)
  • 图形/游戏开发(状态压缩)
  • 加密与哈希算法
  • 高性能计算(避免分支、优化内存)

 

http://www.dtcms.com/a/596364.html

相关文章:

  • (129页PPT)罗兰贝格银行风险预警管理体系规划(附下载方式)
  • 建设银行网站可以更改个人电话网址大全域名解析
  • 增删查改(其一) —— insert插入 与 select条件查询
  • JuiceSSH+cpolar解锁手机远程Linux新姿势,无需公网IP,固定地址稳定用
  • 传统生产制造企业手写单据数字化落地:旗讯 OCR 的技术实现与系统对接方案
  • 如何添加网站白名单广州建设网站的公司
  • nnUNet 训练与推理命令操作记录
  • 【C#】从一次异步锁逐渐展开浅谈服务器架构解决重复编码问题,我与AI的一次深度讨论得出的一些解决方案
  • PKHeX 宝可梦存档编辑工具 用户可自由修改宝可梦属性、技能、道具、图鉴完成度等信息
  • 深度解析:环形链表——手撕面试经典题
  • elasticsearch集群访问中的通信问题
  • 西安模板网站建设套餐佛山做网站费用
  • 什么是RKNN?
  • 《智元启示录》升级说明:从「AI 思考集」到「AI 决策内参」
  • Ansible 基础配置与负载均衡部署实践
  • 融合先验文本与解剖学知识的多模态回归网络用于舌鳞状细胞癌浸润深度的自动预测|文献速递-文献分享
  • 【负载均衡】LVS DR模式详解
  • 从零搭建 ASP.NET 单文件 Web 项目:一个能真用的 BookShop 管理页实战
  • 安徽专业网站建设长春能开发网站的公司
  • hadoop-3.4.1 单机伪部署
  • Nginx(4)--Nginx与tomcat反向代理和负载均衡
  • 37负载均衡介绍和nginx模块编译安装
  • 网站开发成本都有哪几项北京app建设 网站开发公司
  • 01-总结
  • VR党建赛车模拟系统:让党史学习“开“出沉浸式新体验
  • Logstash 从 MySQL 同步数据到 Kafka
  • 通过 HelloWorld 深入剖析 JVM 启动过程
  • css-文字背景渐变色
  • Tailwind CSS的grid布局
  • LangGraph基础教程(4)---LangGraph的核心能力