Java位运算符直接操作二进制位,高效且低开销;核心包括&(提取/清零位)、|(设置标志)、^(可逆交换/校验)、~(取反得补码)、>>/>>>(移位乘除);适用于奇偶判断、防溢出求均值、判2的幂等场景。

Java 中的位运算符能直接操作整数的二进制位,不经过类型转换或数学运算,因此执行速度快、资源开销低。高效的关键在于理解底层逻辑并匹配典型场景,而不是盲目套用符号。
掌握核心运算符的行为本质
位运算不是“黑盒操作”,每个符号对应明确的二进制逻辑:
-
&(按位与):同为 1 才得 1,常用于“提取特定位”或“清零某些位”。例如
value & 0xFF可保留最低 8 位,屏蔽高位。 -
|(按位或):有 1 就得 1,适合“设置标志位”。比如权限系统中
flags | READ_PERMISSION开启读权限。 -
^(按位异或):相同为 0、不同为 1,具备可逆性:
a ^ b ^ b == a。这是无临时变量交换、数据加密和校验的基础。 -
~(按位取反):逐位翻转,注意结果是补码形式。例如
~5得到的是 -6,因为 5 的补码是000...0101,取反后为111...1010,即 -6。 - >、>>>(移位运算):左移 n 位相当于乘以 2ⁿ(不溢出前提下),右移相当于除以 2ⁿ(>> 保留符号,>>> 总是补 0)。
用位运算替代低效常规写法
很多看似简单的计算,用位运算能避开潜在问题:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
判断奇偶:用
n & 1 == 0比n % 2 == 0更快,且不受负数取余行为影响。 -
求平均值防溢出:
(a & b) + ((a ^ b) >> 1)可安全计算两个 int 的平均值,避免(a + b) / 2因和溢出导致错误。 -
判断是否为 2 的幂:表达式
(n & (n - 1)) == 0 && n != 0一行搞定。原理是 2 的幂二进制只有一个 1,减 1 后低位全变 1,与原数相与必为 0。 -
快速乘除 2 的幂:
x 等价于 <code>x * 8,y >> 4等价于y / 16(y ≥ 0 时语义一致)。
注意数据类型与符号位的影响
Java 所有整型(byte、short、int、long、char)都以补码存储,负数参与位运算时结果由补码决定:
立即学习“Java免费学习笔记(深入)”;
- 不要假设
~x就是-x;实际是~x == -x - 1。 - 右移需区分
>>(带符号)和>>>(无符号)。例如-8 >> 2得 -2,而-8 >>> 2得 1073741822(高位补 0)。 - 进行位操作前,建议用
Integer.toBinaryString(x)查看实际二进制表示,尤其调试负数时。
实际编码中的实用技巧
位运算的价值体现在结构化使用中:
-
用一个 int 存多个布尔状态:每位代表一个开关,如
int status = 0;,用status |= 1 开启第 3 位,用 <code>(status & (1 判断是否开启。 -
掩码组合权限:定义常量
READ = 1, WRITE = 2, EXEC = 4,则READ | WRITE表示读写权限,all & WRITE可检测是否含写权限。 -
位图(BitSet)底层思想:用 long 数组模拟超大布尔数组,用
array[index / 64] & (1L 快速查值。

















