Java中位与(&)和位或(|)是对整数二进制补码逐位运算的算术操作符,不适用于boolean类型,分别实现“全1得1”和“有1得1”,常用于清零、置位、标志合并等场景。

Java 中的位与(&)和位或(|)是直接对整数类型的二进制补码表示逐位操作的运算符,不涉及布尔逻辑短路,也不转换为 true/false。它们只作用于 byte、short、int、long(以及 char),对 boolean 类型无效(别和逻辑与 &&、逻辑或 || 混淆)。
位与 &:全 1 才得 1
对两个操作数相同位置的比特进行“与”运算:只有两个都是 1,结果该位才是 1;其余情况(0&0、0&1、1&0)均为 0。
- 常用于清零某些位(配合掩码):比如
n & 0xFF只保留低 8 位,高位全变 0 - 判断某位是否为 1:如
(n & 8) != 0等价于判断第 4 位(从 0 开始数,即 2³)是否置位 - 注意:负数按补码参与运算,例如
-1 & 0x0F结果是0xF(即 15),因为 -1 的 int 补码全是 1
位或 |:有 1 就得 1
对相同位置的比特进行“或”运算:只要有一个是 1,结果该位就是 1;仅当两个都是 0 时才为 0。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 常用于置位(打开某些位):如
n | 0x10确保第 5 位(2⁴)为 1,其余位不变 - 合并标志位:多个
public static final int FLAG_A = 1, FLAG_B = 2, FLAG_C = 4;,可用flags | FLAG_B启用 B - 不改变原值,返回新结果:位运算是纯函数式操作,
n | mask不修改 n,需显式赋值:n = n | mask或简写为n |= mask
常见误区提醒
别把 & 和 | 当成布尔运算符来用:
立即学习“Java免费学习笔记(深入)”;
-
if (a & b)编译不过(除非 a、b 是整数),而if ((a & b) != 0)才合法且有意义 - 布尔表达式中误用
&代替&&会失去短路特性,还可能引发空指针或副作用(如obj != null & obj.isValid()中即使 obj 为 null 也会调用 isValid()) - char 类型可参与位运算(自动提升为 int),但字符串不行;想对字符串做位操作,得先转成字节数组或 int 数组
快速验证小技巧
用 Integer.toBinaryString(x) 查看运算前后的二进制形式,比心算更可靠:
System.out.println(Integer.toBinaryString(5 & 3)); // 输出 "1"(101 & 011 = 001)System.out.println(Integer.toBinaryString(5 | 3)); // 输出 "111"(101 | 011 = 111)

















