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) |
循环右移 |