java 中的位运算符直接对整数的二进制补码形式进行逐位操作,包括按位与(&)、或(|)、异或(^)和非(~)。要使用它们,只需将运算符放在两个整数变量之间,例如 a & b,程序会返回一个新的整数值。这些运算常用于权限掩码、标志位处理或底层数据压缩,使用时需注意负数在 java 中以补码存储,且左移右移会影响符号位。

& 按位与如何用于提取特定标志位
使用 & 可以检查某个整数是否包含特定的二进制位。只要将目标值与一个只有该位为 1 的掩码进行按位与运算,如果结果不为 0,则说明该位被置位。例如,判断一个整数第 0 位是否为 1,可以使用 (value & 1) != 0。这种方法在解析协议头或配置项时非常常见,因为它能精确隔离出我们关心的那一位,而不受其他位的影响。

public class BitwiseDemo {
public static void main(String[] args) {
int value = 5; // 二进制 0000 0101
int mask = 1; // 二进制 0000 0001
// 检查第 0 位
boolean bit0Set = (value & mask) != 0;
System.out.println("Bit 0 is set: " + bit0Set); // true
// 检查第 2 位
int mask2 = 4; // 二进制 0000 0100
boolean bit2Set = (value & mask2) != 0;
System.out.println("Bit 2 is set: " + bit2Set); // true
// 检查第 3 位
int mask3 = 8; // 二进制 0000 1000
boolean bit3Set = (value & mask3) != 0;
System.out.println("Bit 3 is set: " + bit3Set); // false
}
}
| 按位或如何用于合并多个标志位
使用 | 可以将多个标志位合并到一个整数中。通过将不同的掩码进行按位或运算,可以将多个独立的布尔状态压缩成一个整数。例如,设置第 0 位和第 2 位,可以使用 result = result | 1 | 4。这种操作是幂等的,多次执行相同的结果不会改变最终状态,非常适合用于构建配置对象或权限集合,避免使用大量的布尔变量。
立即学习“Java免费学习笔记(深入)”;

public class BitwiseMerge {
public static void main(String[] args) {
int flags = 0;
// 设置第 0 位
flags |= 1;
System.out.println("After setting bit 0: " + Integer.toBinaryString(flags));
// 设置第 2 位
flags |= 4;
System.out.println("After setting bit 2: " + Integer.toBinaryString(flags));
// 尝试再次设置第 0 位,状态不变
flags |= 1;
System.out.println("After setting bit 0 again: " + Integer.toBinaryString(flags));
}
}
负数在进行 >> 右移时符号位如何处理
在 Java 中,负数采用补码表示,因此在进行算术右移 >> 时,高位会填充符号位(即 1),从而保持数值的负号不变。例如,-1 的二进制补码是全 1,无论右移多少位,结果仍然是 -1。这种行为与逻辑右移 >>> 不同,后者总是用 0 填充高位。理解这一点对于处理有符号数据的位移操作至关重要,特别是在涉及网络字节序转换或加密算法时,错误的移位方式会导致数值符号翻转。


















