c++的位运算怎么用 与、或、异或、移位操作详解【底层知识】
技术百科
尼克
发布时间:2026-01-02
浏览: 次 位运算是直接操作整数二进制表示的底层操作,常用于系统编程、算法优化等;与运算(&)逐位比较,同为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
# 算法
# 清零
# 则为
# 掩码
# 同为
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么关闭触摸键盘图标_Windows11
- mac怎么打开终端_MAC终端Terminal使用
- Mac电脑进水了怎么办_MacBook进水后紧急处
- 如何使用Golang安装依赖库_管理模块和第三方包
- c++怎么操作redis数据库_c++ hired
- Windows如何设置登录时的欢迎屏幕背景?(锁屏
- 如何使用Golang reflect检查方法数量_
- Win11怎么设置快速访问主页_Windows11
- php能控制zigbee模块吗_php通过串口与c
- Win10怎么限制单程序CPU占用上限_Win10
- 电脑的“网络和共享中心”去哪了_Windows 1
- Win11任务栏怎么放到顶部_Win11修改任务栏
- Win11怎么修改DNS服务器 Win11设置DN
- Win11怎么关闭通知消息_屏蔽Windows 1
- 如何在 ACF 中正确更新嵌套多层 Group 字
- php打包exe如何加密代码_防反编译保护方法【技
- php转mp4怎么保留字幕_php处理带字幕视频转
- c++协程和线程的区别 c++异步编程模型对比【核
- Win11无法安装软件怎么办_Win11解除应用安
- Windows10如何更改任务栏高度_Win10解
- 如何高效获取循环末次生成的 NumPy 数组最后一
- Python迭代器生成器进阶教程_节省内存与懒加载
- 如何使用Golang编写单元测试_创建Test函数
- MySQL 中使用 IF 和 CASE 实现查询字
- php怎么捕获异常_trycatch结构处理运行时
- Win10怎么卸载鲁大师_Win10彻底卸载鲁大师
- Win11怎么更改系统语言_Win11中文语言包下
- Win11怎么检查TPM2.0模块_Windows
- Win11如何关闭小娜Cortana Win11禁
- Win11怎么更改鼠标指针_Windows 11自
- Win11色盲模式怎么开_Win11屏幕颜色滤镜设
- php订单日志怎么按金额排序_php按订单金额排序
- Win11资源管理器卡顿怎么办 Win11文件资源
- 如何在 Go 项目开发中正确处理本地包导入与远程模
- c++的STL算法库find怎么用 在容器中查找指
- Win10怎么查看内存时序参数_Win10CPU-
- TestNG的testng.xml配置文件怎么写
- Win11怎么设置环境变量_Win11配置Path
- Python网络异常模拟_测试说明【指导】
- Windows 10自带杀毒软件在哪_Window
- Windows10如何更改鼠标图标_Win10鼠标
- Win11怎么退出微软账户_切换Win11为本地账
- php怎么下载安装并配置环境变量_命令行调用PHP
- Win11快速助手怎么用_Win11远程协助连接教
- 如何解决同一段404代码在不同主机上表现不一致的问
- 为什么本地php环境运行php脚本卡顿_php执行
- Avalonia如何实现跨窗口通信 Avaloni
- 如何在Golang中指定模块版本_使用go.mod
- Win11如何设置开机自动联网 Win11宽带连接
- ACF 教程:正确更新嵌套在多层 Group 字段

换两个整数:
QQ客服