Java 位运算符深度解析:从入门到实战进阶

·

在所有 Java 运算符中,“位运算符(Bitwise Operators)”是最接近硬件的一级操作。它以二进制位为单位完成与、或、异或、取反、移位等动作,被广泛应用于底层编程、标志位管理、加密算法以及图像渲染等场景。理解并合理使用这些运算符,不仅能写出更短、更快的 Java 程序,还能为阅读源码、面试八股题和性能调优打下坚实基础。

核心关键词:Java位运算、位运算符、二进制、按位与、按位或、异或、补码、位移、性能优化、面试高频


位运算符的七种形态

Java 位运算符只有 7 种,全部围绕 32 位或 64 位整数类型(byteshortintlong)工作,可以分成两大类:

逻辑位运算符

移位运算符


逐位拆解七大运算符

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 → 7

3. 按位异或 ^

规则:相同为 0,相异为 1
场景

示例:

int d = a ^ b; // 0000 0010 → 2

4. 按位取反 ~(易错点)

规则: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; // -4

7. 无符号右移 >>>

规则:整体右移,无论正负高位一律补 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

高频场景与性能优势

👉 0.5 小时掌握位运算性能优化实战


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 里改写示例代码,用断点观察二进制变化,才是内化知识的王道。