c++的位运算怎么用 与、或、异或、移位操作详解【底层知识】


位运算是直接操作整数二进制表示的底层操作,常用于系统编程、算法优化等;与运算(&)逐位比较,同为1才得1,用于掩码提取(如x & 0xF取低4位)、判断奇偶(x & 1)或清零特定位(如x & ~(1

位运算是直接操作整数二进制表示的底层操作,在C++中高效且常用于系统编程、算法优化、状态压缩、加密、硬件交互等场景。它不经过高级抽象,直击内存中的比特(bit),因此理解清楚每种运算的逻辑和边界行为至关重要。

与运算(&):提取特定位或清零

按位与是逐位比较两个操作数,仅当两对应位都为1时结果才为1,否则为0。最常用在“掩码提取”和“清零特定位置”。

  • 提取某几位:比如想获取一个整数 x 的低4位,可写 x & 0xF(0xF = 0b1111),因为其他高位与0相与全为0,只留下低4位原值。
  • 判断奇偶:x & 1 等价于 x % 2,因为最低位为1则为奇数,为0则为偶数。
  • 清零某些位:如需把 int x 的第3位(从0开始计)强制置0,可用 x & ~(1 —— 先构造掩码 1

或运算(|):设置特定位

按位或是逐位比较,只要有一个为1结果就为1。主要用途是“置位”——把某些位强制设为1,而不影响其他位。

  • 开启某个标志位:比如用一个整数 flags 表示多个开关状态,第2位代表“是否启用日志”,那么开启它就是 flags |= (1 ,等价于 flags = flags | (1
  • 合并多个标志:若 LOG_ON = 1flags = LOG_ON | DEBUG_ON | ERROR_ON
  • ,得到 0b111。

异或运算(^):翻转、交换、判等

按位异或:相同为0,不同为1。它有三大关键性质:自反性(a ^ a = 0)、恒等性(a ^ 0 = a)、可交换结合性。这些让异或非常强大。

  • 翻转特定位:x ^ (1
  • 不借助临时变量交换两个整数
    a ^= b;
    b ^= a;
    a ^= b;

    原理是利用 a^b^b == a 和 b^a^a == b,但注意该技巧仅适用于整型且 a、b 不指向同一内存地址(否则会归零)。
  • 快速判等:(a ^ b) == 0 表示 a 和 b 完全相等(对整数、指针有效);比 a == b 少一次分支预测,在某些嵌入式或汇编级优化中有意义。

移位运算(>):高效乘除与布局操作

左移(>):向右移动n位,左边补符号位(算术右移)或0(逻辑右移),C++中对有符号数的右移行为由编译器定义,但主流平台(如x86/x64)对 signed int 执行算术右移(保持符号)。

  • 替代乘除(无溢出前提下):x > 2 等价于 x / 4(对非负x向下取整)。编译器通常自动优化,但显式写出可增强语义清晰度。
  • 构建复合数据:比如把 r(8位)、g(8位)、b(8位)、a(8位) 打包成一个32位RGBA颜色值:
    color = (r
  • 小心有符号右移陷阱:对负数如 -8 >> 1,结果不是 -4(数学上),而是实现定义。更安全的做法是先转为无符号类型再移位:
    static_cast(x) >> n,尤其在跨平台或协议解析中必须明确。


# c++  # int  # 算法  # 清零  # 则为  # 多个  # 掩码  # 同为  # 中有  # 设为  # 三大  # 适用于  # 而不 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Python对象生命周期管理_创建销毁解析【教程】  Windows 11如何查看系统激活密钥_Windows 11使用CMD或PowerShell命令找回Product Key  Windows10如何重置此电脑_Windows10电脑重置方法【步骤】  Windows10系统怎么查看运行时间_Win10 CPU正常运行时间查询  Win11怎么清理C盘虚拟内存_Win11清理虚拟内存设置【教程】  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Golang如何遍历目录文件_Golang filepath.Walk目录遍历操作方法  c# await 一个已经完成的Task会发生什么  获取 PHP 文件最后修改时间的正确方法  如何在Golang中修改数组元素_通过指针实现原地更新  Win11怎么设置虚拟键盘_打开Win11屏幕键盘操作指南【技巧】  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  如何使用Golang开发基础文件下载功能_Golang HTTP文件响应与缓存实现  PHP主流架构怎么集成Redis缓存_配置步骤【方法】  Win11怎么设置虚拟内存_Windows 11优化内存性能提升速度【技巧】  Go语言中slice追加操作的底层共享机制解析  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Win10如何更改电脑休眠时间_Windows10电源和睡眠选项调整  Windows蓝屏错误0x00000023怎么修复_FAT文件系统错误处理  海外搜索引擎推广效果怎么样,怎么分析效果!  Windows10如何查看蓝屏日志_Win10使用事件查看器分析Dump文件  Win10闹钟铃声怎么自定义 Win10闹钟自定义铃声教程【方法】  Win11怎样安装剪映专业版_Win11安装剪映教程【步骤】  Windows11怎么用“记事本”自动换行与编码 Windows11记事本启用自动换行选择UTF-8编码避免乱码兼容多语言【教程】  PHP主流架构怎么部署到Docker_容器化流程【操作】  如何使用Golang开发简单的聊天室消息存储_Golang WebSocket数据持久化方法  PHP中require语句后直接调用返回对象方法的语法解析  如何在Golang中处理JSON字段缺失_Golangjson解析字段校验方法  PythonFastAPI项目实战教程_API接口与异步处理实践  PythonWeb前后端整合项目教程_FastAPIReact完整实例  如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法  Python实现图数据库操作_Neo4j核心CRUD与图算法解析  Win11文件扩展名怎么显示 Win11查看文件后缀名设置【步骤】  C#如何在一个XML文件中查找并替换文本内容  Mac如何修改Hosts文件?(本地开发与屏蔽网站)  Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】  PythonPandas数据分析教程_数据清洗与处理技巧  如何在Golang中使用log包输出不同级别日志_Golang log日志管理与分类  Windows10系统怎么查看显卡型号_Win10 dxdiag显示选项卡  PHP 中如何在函数内持久化修改引用变量的指向  本地php环境出现502错误_nginx或apache502badgateway解决技巧【解答】  Windows系统文件被保护机制阻止怎么办_权限不足错误处理方案  Win11怎么恢复出厂设置_Win11重置此电脑保留文件方法【详解】  Win11怎样安装搜狗输入法_Win11安装搜狗输入法教程【步骤】  如何用::实现单例模式_php静态方法与作用域操作符应用【技巧】  c++ std::future和std::promise c++线程间通信【教程】  php订单日志怎么记录评价_php记录订单评价日志方法【方法】  Windows7如何安装系统镜像_Windows7系统安装教程【步骤】  如何在 Django 中修改用户密码后保持会话不丢失  Win11开机自检怎么关闭_跳过Win11开机磁盘扫描修复方法【技巧】 

 2026-01-02

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.