在所有 Java 运算符中,“位运算符(Bitwise Operators)”是最接近硬件的一级操作。它以二进制位为单位完成与、或、异或、取反、移位等动作,被广泛应用于底层编程、标志位管理、加密算法以及图像渲染等场景。理解并合理使用这些运算符,不仅能写出更短、更快的 Java 程序,还能为阅读源码、面试八股题和性能调优打下坚实基础。
核心关键词:Java位运算、位运算符、二进制、按位与、按位或、异或、补码、位移、性能优化、面试高频
位运算符的七种形态
Java 位运算符只有 7 种,全部围绕 32 位或 64 位整数类型(byte、short、int、long)工作,可以分成两大类:
逻辑位运算符
&按位与|按位或^按位异或~按位取反(一元)
移位运算符
<<左移>>有符号右移>>>无符号右移
逐位拆解七大运算符
1. 按位与 &
规则:两位都为 1,结果为 1,否则 0
场景:清除特定位、判断标志位是否同时成立
int a = 5; // 0000 0101
int b = 7; // 0000 0111
int c = a & b; // 0000 0101 → 5想快速确认某数是否为偶数?与 1 做 & 运算即可。结果为 0 则为偶数。
2. 按位或 |
规则:任意一位为 1,结果为 1
场景:打开标志位、设置多段权限
示例:
int flag = a | b; // 0000 0111 → 73. 按位异或 ^
规则:相同为 0,相异为 1
场景:
- 交换变量值:
a ^= b; b ^= a; a ^= b;无临时变量即可交换两数 - 校验差异位:计算 Hash、Diff 算法常用
示例:
int d = a ^ b; // 0000 0010 → 24. 按位取反 ~(易错点)
规则:0→1,1→0
注意:结果以 补码 形式表示负数,肉眼直接看到的十进制并非简单“255-原值”
示例:
byte x = 5; // 0000 0101
int y = ~x; // 1111 1010 → -6 (32 位补码)5. 左移 <<
规则:整体左移 n 位,低位补 0,等效乘以 2^n
int v = 4 << 2; // 100 → 10000 → 16企业级注意:左移可能溢出,务必使用 long 或条件允许时加边界检查。
6. 有符号右移 >>
规则:整体右移 n 位,正数高位补 0,负数高位补 1,保留符号
int neg = -8 >> 1; // -47. 无符号右移 >>>
规则:整体右移,无论正负高位一律补 0,符号可能丢失
int un = -8 >>> 1; // 2147483644完整示例:交互模式体验位运算
以下程序读取键盘输入的两个整数,演示 7 种常见运算。将其复制到 IDE 直接运行即可观察二进制层面的变化。
import java.util.Scanner;
public class BitwiseDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println("AND : " + (a & b));
System.out.println("OR : " + (a | b));
System.out.println("XOR : " + (a ^ b));
System.out.println("NOT a : " + ~a);
System.out.println("a<<2 : " + (a << 2));
System.out.println("a>>2 : " + (a >> 2));
System.out.println("a>>>2 : " + (a >>> 2));
}
}输入示例
4 8输出示例
AND : 0
OR : 12
XOR : 12
NOT a : -5
a<<2 : 16
a>>2 : 1
a>>>2 : 1高频场景与性能优势
- 位掩码:用 32 位整数存储 32 个布尔标志位,每个 bit 代表开关状态,节省内存。
- 倍率运算:通过位移实现乘/除以 2^n,比乘除指令快 3-5 倍。
- 加密:AES、DES 等算法内部大量使用 XOR 和循环移位。
- 游戏开发:碰撞检测、像素操作常把 8×8 小图用 64 bit
long打包。
FAQ:面试与实战中最容易踩的坑
Q1:为什么取反 ~5 得到的是 -6,而不是 250?
A:Java 的整数默认是 32 位有符号 的二进制补码。~5 结果是 32 位全 1 高位向前推后的负数。
Q2:<< 与 >>> 哪个更适合乘 2?
A:左移 << 直接等价于乘以 2^n,速度最快;>>> 无符号右移会丢失负号,通常不适合乘 2。
Q3:使用位运算时遇到溢出怎么办?
A:把变量声明为 long 或对运算结果做 & 0xFFFFFFFFL 屏蔽处理,可显式控制位宽。
Q4:位运算符能与 boolean 类型混用吗?
A:不可以,Java 中的按位与、或、异或仅支持整数类型。逻辑 &&、|| 才作用于 boolean。
Q5:位运算一定比加减乘除更快吗?
A:在 热点代码 JVM 会内联优化,最佳情况下位移比乘除快 3-5 倍;但在解释模式下差距很小,切勿提前优化方案。
Q6:如何在打印时直接输出二进制字符串?
A:使用 Integer.toBinaryString(i),注意它不包括前导 0,如需固定位宽请自行补零。
总结
掌握 Java 位运算符的“七把钥匙”,你就拥有了操纵比特级别的超能力。牢记“与按位清零,或按位设置,抑或按位翻转,移位按位缩放”这一口诀,足以应对从权限系统到图形加速的各类场景。动手在 IDE 里改写示例代码,用断点观察二进制变化,才是内化知识的王道。