Java位运算符共6个:&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移)、>>(带符号右移)、>>>(无符号右移),均基于整数补码表示逐位操作。

Java 中的位运算符直接对整数类型的二进制补码表示进行操作,不关心数值含义,只逐位计算。理解这一点是正确使用位运算的关键。
位运算符有哪些,各起什么作用
Java 提供 6 个基本位运算符:
- &(按位与):两个对应位都为 1 时结果为 1,否则为 0。常用于清零某些位或判断标志位是否开启。
- |(按位或):两个对应位中至少一个为 1 时结果为 1。常用于设置标志位。
- ^(按位异或):两个对应位不同时结果为 1。可用于交换变量、翻转特定位、简单加密。
- ~(按位取反):对每个位取反(0→1,1→0)。注意:对有符号整数取反后结果是负数(因补码表示)。
- <<(左移):二进制位向左移动 n 位,右边补 0。等价于乘以 2ⁿ(无溢出前提下)。
- >>(带符号右移):向右移动 n 位,左边补符号位(正数补 0,负数补 1),保持符号不变。
- >>>(无符号右移):向右移动 n 位,左边一律补 0,结果恒为非负数(即使原数为负)。
整数在内存中怎么存,影响位运算结果
Java 中 byte、short、int、long 均以补码形式存储。例如 int 类型占 32 位,-1 的补码是 32 个 1(0xFFFFFFFF)。因此:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 对 -1 执行 ~ 操作,得到 0(所有位翻转);
- 对 -8 执行 >> 1,结果是 -4(补符号位);而 >>> 1 得到 2147483644(高位全补 0,变成很大的正数);
- 位运算始终作用于完整位宽(如 int 总是 32 位),不会“截断”或“自动扩展”。
常用技巧和实际应用场景
位运算不是炫技,而是解决特定问题的高效工具:
立即学习“Java免费学习笔记(深入)”;
-
快速判断奇偶:
n & 1 == 0表示偶数(最低位为 0); -
获取第 k 位(从 0 开始):
(n >> k) & 1; -
设置第 k 位为 1:
n | (1 << k); -
清除第 k 位为 0:
n & ~(1 << k); -
翻转第 k 位:
n ^ (1 << k); -
交换两个整数(无需临时变量):
a ^= b; b ^= a; a ^= b;(注意:a 和 b 不能是同一变量引用)。
注意事项和易错点
位运算看似底层简单,但容易出错:
- 优先级低于算术运算符,混合使用时务必加括号,例如
a & b == 0实际是a & (b == 0),应写成(a & b) == 0; - 移位位数超过类型位宽时,Java 会自动取模(如 int 是
n % 32),1 << 35等价于1 << 3; - 不要对 float/double 使用位运算——编译不通过;需用
Float.floatToIntBits()等方法先转成 int; - 位运算不适用于 byte/short 直接操作,它们会先被提升为 int 再计算,结果也是 int,赋值回 byte 时需强制转换并注意截断。

















