Java位运算直接作用于整数的二进制补码表示,支持&、|、^、~、、>>>七种运算符,小类型自动提升为int,常用于掩码、权限、位提取等底层操作。

Java 中基本数据类型(byte、short、int、long、char)的位运算是直接作用于其**二进制补码表示**上的,不是简单按十进制算术理解。所有位运算都以整数在内存中的实际二进制形式为操作对象,且结果仍为对应整型类型。
位运算操作的是补码,不是原码
Java 中负数一律用补码存储。例如:
- 5 的 int 补码是 00000000 00000000 00000000 00000101
- -5 的 int 补码是 11111111 11111111 11111111 11111011(由原码取反再+1得到)
位运算(如 &、|、^、~)对这两个补码逐位计算,结果也按补码解释为十进制数。
这意味着:
- ~5 不等于 -5,而是 -6(因为 ~000…0101 = 111…1010,即 -6)
- -10 & 8 需先写出 -10 的补码(11110110),再与 8(00001000)按位与,得 00000000 → 结果为 0
支持的位运算符及对应行为
Java 提供 7 种位运算符,全部适用于整型基本类型:
-
&:按位与。同为 1 才得 1;常用于掩码提取(如
value & 0xFF取低 8 位) -
|:按位或。有 1 就得 1;常用于权限合并(如
READ | WRITE) -
^:按位异或。相同为 0,不同为 1;满足
a ^ a == 0、a ^ 0 == a,可用于交换变量或校验 - ~:按位取反。单目运算,每位 0↔1;注意符号位也被翻转,结果必为负数(除非操作数为 0)
- :有符号左移。高位丢弃,低位补 0;等价于乘以 2ⁿ(不溢出前提下)
- >>:有符号右移。低位丢弃,高位补符号位;正数补 0,负数补 1;等价于带符号除以 2ⁿ
- >>>:无符号右移。低位丢弃,高位一律补 0;负数右移后变正,常用于位提取(如获取某段比特)
不同类型参与运算时的自动提升规则
Java 会将较小类型**自动提升为 int** 再运算(除非显式使用 long):
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
-
byte b = 5; b & 3→ 先将 b 和 3 都转为 int,再计算,结果为 int - 若需保持 byte 类型,必须强制转型:
(byte)(b & 3) -
char c = 'A'; c | 0x20→ char(16 位)提升为 int(32 位)后运算 - long 运算需至少一个操作数带 L 后缀,否则仍按 int 处理(如
1L 正确,<code>1 是 int 左移,结果可能非预期)
典型实用示例(紧扣二进制操作)
以下代码体现“真正操作二进制位”的本质:
立即学习“Java免费学习笔记(深入)”;
- 判断奇偶:
n & 1—— 只看最低位,0 表示偶,1 表示奇 - 清零低 4 位:
n & ~0xF—— 先~0xF得全 1…11110000,再与操作屏蔽低位 - 获取第 k 位(从 0 开始):
(n >> k) & 1—— 右移到最低位,再 &1 提取 - 设置第 k 位为 1:
n | (1 - 翻转第 k 位:
n ^ (1
这些操作不依赖数值大小,只依赖二进制位模式,是底层控制的核心手段。

















