1. Java 支持的位运算符
Java 提供了 7 种位运算符:
运算符 | 名称 | 描述 | 示例 |
---|---|---|---|
& |
按位与(AND) | 两个位都为 1 时,结果才为 1 | 5 & 3 → 1 |
` | ` | 按位或(OR) | 两个位有一个为 1 时,结果就为 1 |
^ |
按位异或(XOR) | 两个位不同时,结果为 1 | 5 ^ 3 → 6 |
~ |
按位取反(NOT) | 所有位取反(0→1,1→0) | ~5 → -6 |
<< |
左移(Left Shift) | 所有位向左移动,低位补 0 | 5 << 1 → 10 |
>> |
右移(Right Shift) | 所有位向右移动,高位补符号位 | -5 >> 1 → -3 |
>>> |
无符号右移(Unsigned Right Shift) | 所有位向右移动,高位补 0 | -5 >>> 1 → 2147483645 |
2. 位运算详解
(1) 按位与(&
)
-
规则:两个位都为 1 时,结果才为 1,否则为 0。
-
示例:
javaint a = 5; // 二进制:0101 int b = 3; // 二进制:0011 int c = a & b; // 二进制:0001 → 1 System.out.println(c); // 输出:1
-
应用:
- 判断奇偶:
(n & 1) == 0
→ 偶数。
- 判断奇偶:
(2) 按位或(|
)
-
规则:两个位有一个为 1 时,结果就为 1。
-
示例:
javaint a = 5; // 0101 int b = 3; // 0011 int c = a | b; // 0111 → 7 System.out.println(c); // 输出:7
-
应用:
- 合并多个标志位(如
READ | WRITE | EXECUTE
)。
- 合并多个标志位(如
(3) 按位异或(^
)
-
规则:两个位不同时,结果为 1,否则为 0。
-
示例:
javaint a = 5; // 0101 int b = 3; // 0011 int c = a ^ b; // 0110 → 6 System.out.println(c); // 输出:6
-
特性:
-
a ^ a = 0
(相同数异或为 0)。 -
a ^ 0 = a
(任何数与 0 异或不变)。
-
-
应用:
-
交换两个数(不使用临时变量):
javaint x = 5, y = 3; x = x ^ y; y = x ^ y; // y = (x ^ y) ^ y = x x = x ^ y; // x = (x ^ y) ^ x = y System.out.println(x + ", " + y); // 输出:3, 5
-
(4) 按位取反(~
)
-
规则:所有位取反(0→1,1→0)。
-
示例:
javaint a = 5; // 0000 0101 int b = ~a; // 1111 1010(补码表示) System.out.println(b); // 输出:-6
-
注意:
- Java 使用补码表示负数,
~5
实际上是-6
。
- Java 使用补码表示负数,
(5) 左移(<<
)
-
规则:所有位向左移动,低位补 0。
-
示例:
javaint a = 5; // 0000 0101 int b = a << 1; // 0000 1010 → 10 System.out.println(b); // 输出:10
-
应用:
- 快速计算
a * 2^n
(如a << 3
=a * 8
)。
- 快速计算
(6) 右移(>>
)
-
规则:所有位向右移动,高位补符号位(正数补 0,负数补 1)。
-
示例:
javaint a = 5; // 0000 0101 int b = a >> 1; // 0000 0010 → 2 int c = -5 >> 1; // 1111 1101 → -3 System.out.println(b + ", " + c); // 输出:2, -3
-
应用:
- 快速计算
a / 2^n
(如a >> 2
=a / 4
)。
- 快速计算
(7) 无符号右移(>>>
)
-
规则:所有位向右移动,高位补 0(不考虑符号位)。
-
示例:
javaint a = -5; // 1111 1111 1111 1111 1111 1111 1111 1011 int b = a >>> 1; // 0111 1111 1111 1111 1111 1111 1111 1101 → 2147483645 System.out.println(b); // 输出:2147483645
-
应用:
- 处理无符号整数(Java 没有无符号类型,但可以用
>>>
模拟)。
- 处理无符号整数(Java 没有无符号类型,但可以用
3. 位运算的常见用途
(1) 判断奇偶
java
if ((n & 1) == 0) {
System.out.println("偶数");
} else {
System.out.println("奇数");
}
(2) 交换两个数
java
int x = 5, y = 3;
x = x ^ y;
y = x ^ y;
x = x ^ y;
System.out.println(x + ", " + y); // 输出:3, 5
(3) 计算绝对值
java
int a = -5;
int abs = (a ^ (a >> 31)) - (a >> 31);
System.out.println(abs); // 输出:5
(4) 判断是否为 2 的幂
java
boolean isPowerOfTwo = (n & (n - 1)) == 0;
System.out.println(isPowerOfTwo); // 8 → true, 7 → false
(5) 快速计算 2^n
java
int power = 1 << n; // 2^n
System.out.println(power); // n=3 → 8
4. 总结
运算符 | 用途 | 示例 |
---|---|---|
& |
判断奇偶、权限控制 | (n & 1) == 0 |
` | ` | 合并标志位 |
^ |
交换变量、加密 | a ^= b; b ^= a; a ^= b; |
~ |
取反 | ~5 → -6 |
<< |
快速乘以 2^n | 5 << 2 → 20 |
>> |
快速除以 2^n | -5 >> 1 → -3 |
>>> |
无符号右移 | -5 >>> 1 → 2147483645 |