Java 位运算
🚀 基础位操作符
Java 里针对整型(int / long)常用的有:
| 操作 | 符号 | 示例 | 说明 |
|---|---|---|---|
| 按位与 | & |
6 & 3 = 2 (110 & 011 = 010) |
都为 1 时结果才为 1 |
| 按位或 | ` | ` | `6 |
| 按位异或 | ^ |
6 ^ 3 = 5 (110 ^ 011 = 101) |
不同为 1,相同为 0 |
| 按位取反 | ~ |
~6 = -7 |
所有位翻转(包含符号位) |
| 左移 | << |
3 << 2 = 12 (011 → 1100) |
等价于乘以 2 的次方 |
| 右移(算术) | >> |
-8 >> 2 = -2 |
保留符号位,除以 2 的次方 |
| 右移(逻辑) | >>> |
-8 >>> 2 |
符号位也移位,左侧补 0 |
🚀 常见位操作技巧
取最低一位的 1
1
x & -x
例:
x = 12 (1100)→x & -x = 4 (0100)。去掉最低的 1
1
x & (x - 1)
例:
12 (1100)→12 & 11 (1011) = 8 (1000)。判断奇偶
1
2(x & 1) == 0 // 偶数
(x & 1) == 1 // 奇数取某一位
1
((x >> k) & 1) // 第 k 位(从 0 开始)
设置某一位为 1
1
x | (1 << k)
清零某一位
1
x & ~(1 << k)
翻转某一位
1
x ^ (1 << k)
🚀 Java 内置的 Long 位方法
Long(同样还有 Integer)里提供了很多工具方法,非常方便:
| 方法 | 示例 | 含义 |
|---|---|---|
Long.bitCount(x) |
bitCount(12) = 2 |
统计二进制中 1 的个数 |
Long.numberOfTrailingZeros(x) |
numberOfTrailingZeros(12)=2 |
末尾连续 0 的个数,即最低的 1 在第几位 |
Long.numberOfLeadingZeros(x) |
numberOfLeadingZeros(12)=60(long 64 位) |
前导 0 的个数 |
Long.highestOneBit(x) |
highestOneBit(12)=8 |
返回最高位的 1 |
Long.lowestOneBit(x) |
lowestOneBit(12)=4 |
返回最低位的 1 |
Long.rotateLeft(x, k) |
rotateLeft(3, 2) |
循环左移 |
Long.rotateRight(x, k) |
rotateRight(3, 2) |
循环右移 |