趣谈位运算:硬核技巧 + Java 实战代码
位运算(Bitwise Operation)是计算机科学中的底层操作,它直接作用于二进制位,能够极大提升运算效率。在算法竞赛、系统开发、加密技术、图像处理等领域,位运算发挥着重要作用。今天,我们就来聊聊 有趣的位运算技巧,并用 Java 实战演示!
1. 为什么要使用位运算?(Why)
相比普通的加减乘除运算,位运算具有以下优势:
- 极致性能:直接操作二进制位,避免 CPU 额外计算,速度比普通算术运算更快。
- 节省空间:位运算可用于状态压缩,如布隆过滤器、权限管理等。
- 简洁优雅:某些数学运算用位运算能 大幅减少代码量。
2. 常见的位运算操作(What)
位运算符 | 含义 | 例子(以 5 和 3 为例) |
---|---|---|
& (按位与) |
两位都为 1,结果才为 1 | 5 & 3 = 1 |
` | ` (按位或) | 只要有一位为 1,结果为 1 |
^ (按位异或) |
相同为 0,不同为 1 | 5 ^ 3 = 6 |
~ (按位取反) |
0 变 1,1 变 0(负数用补码表示) | ~5 = -6 |
<< (左移) |
左移 n 位,相当于 × 2^n |
5 << 1 = 10 |
>> (右移) |
右移 n 位,相当于 / 2^n |
5 >> 1 = 2 |
>>> (无符号右移) |
右移 n 位,高位补 0 | -5 >>> 1 = 2147483645 |
3. 高效实战案例(How)
案例 1:判断奇偶数
技巧:奇数最低位为 1
,偶数最低位为 0
,利用 n & 1
可快速判断。
public static boolean isOdd(int n) {
return (n & 1) == 1;
}
public static void main(String[] args) {
System.out.println(isOdd(5)); // true
System.out.println(isOdd(4)); // false
}
💡 优势:比 n % 2 == 1
更高效,无需除法运算。
案例 2:交换两个数(不用额外变量)
技巧:利用 异或(^)的性质,相同为 0,不同为 1。
public static void swap(int a, int b) {
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a=" + a + ", b=" + b);
}
public static void main(String[] args) {
swap(3, 7); // 输出 a=7, b=3
}
💡 优势:节省临时变量,特别适用于嵌入式开发和高性能计算。
案例 3:判断两个整数是否相等
技巧:a ^ b
为 0 则相等,否则不等。
public static boolean isEqual(int a, int b) {
return (a ^ b) == 0;
}
public static void main(String[] args) {
System.out.println(isEqual(5, 5)); // true
System.out.println(isEqual(5, 3)); // false
}
💡 优势:比 a == b
更加底层,部分 CPU 指令级优化场景可用。
案例 4:计算二进制中 1 的个数(汉明重量)
技巧:n & (n - 1)
可快速去掉最低位的 1。
public static int countOnes(int n) {
int count = 0;
while (n != 0) {
n = n & (n - 1);
count++;
}
return count;
}
public static void main(String[] args) {
System.out.println(countOnes(7)); // 3, 因为 7=111
System.out.println(countOnes(9)); // 2, 因为 9=1001
}
💡 优势:比逐位检查更快,时间复杂度 O(k),其中 k
是 1 的个数。
案例 5:判断一个数是否是 2 的幂
技巧:n & (n - 1) == 0
说明 n
只有 1 个 1
。
public static boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
public static void main(String[] args) {
System.out.println(isPowerOfTwo(8)); // true
System.out.println(isPowerOfTwo(10)); // false
}
💡 优势:比 while(n % 2 == 0)
方案更快,避免了模运算。
案例 6:找出唯一不重复的元素
问题:数组中除了一个元素外,其他元素都成对出现,找出这个唯一元素。
技巧:利用 异或(^)的性质,相同数字异或为 0,0 与任何数异或仍为该数。
public static int findUnique(int[] nums) {
int result = 0;
for (int num : nums) {
result ^= num;
}
return result;
}
public static void main(String[] args) {
int[] arr = {2, 3, 5, 3, 2};
System.out.println(findUnique(arr)); // 5
}
💡 优势:时间复杂度 O(n)
,比 HashMap 方案更节省空间。
4. 总结
✅ 位运算的核心优势:
✔ 高效:比普通运算更快,适合底层优化。
✔ 节省空间:用于状态压缩、数据存储优化。
✔ 应用广泛:在算法竞赛、网络协议、图像处理等领域都有应用。
5. 互动讨论
👉 你用过哪些有趣的位运算技巧?
👉 你还想了解哪些位运算的高级应用?
💬 欢迎留言讨论,点赞收藏! 🚀