1. 二进制运算核心概念解析
在算法竞赛和日常编程中,二进制位运算是最基础也最高效的工具之一。作为一名长期奋战在LeetCode等平台的算法工程师,我深刻体会到掌握位运算对解题效率的提升。今天我将系统梳理二进制运算中最常用的按位或操作(|),从基础特性到高阶应用,帮助你在解题时快速调用这些"二进制武器库"。
1.1 按位或的基础特性
按位或操作符(|)的基本规则很简单:对于两个数的二进制表示,只要对应位有一个为1,结果位就是1。这个看似简单的操作却蕴含着强大的特性:
置1性:1 | 任意二进制位 = 1。这个特性让我们可以精确控制特定位的状态。例如,在状态压缩中,我们经常需要标记某个元素已被访问:
cpp复制visited |= (1 << 5); // 将第5位置1表示已访问
保位性:0 | 任意二进制位 = 原值。这个特性保证了我们可以只修改目标位而不影响其他位。在嵌入式开发中,这个特性常用于寄存器操作:
cpp复制PORTB |= 0x01; // 只修改最低位,其他位保持不变
非递减性:x | y ≥ x且x | y ≥ y。这个数学特性在算法优化中很有用,比如某些情况下可以避免重复计算:
cpp复制if (current | new_value > current) {
// 只有当new_value带来新信息时才处理
}
1.2 按位或的运算优先级
理解运算符优先级是避免bug的关键。按位或的优先级常常让初学者踩坑:
- 算术运算符(+ - * / %)优先级最高
- 接着是移位运算符(<< >>)
- 然后是按位与(&)
- 按位异或(^)
- 按位或(|)
- 最后是逻辑运算符(&& ||)
常见错误示例:
cpp复制int result = x << 1 | y << 1; // 实际相当于 (x<<1) | (y<<1)
// 如果本意是想 x << (1|y) << 1,就需要加括号
提示:当不确定优先级时,使用括号明确运算顺序是最安全的做法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 按位或的实用技巧与应用场景
2.1 状态压缩与标记管理
状态压缩是算法竞赛中的常用技巧,它利用整数的二进制位来表示一组布尔状态。按位
