位运算黑科技:极致优化的 6 大技巧,你都会吗?

Scroll Down

趣谈位运算:硬核技巧 + Java 实战代码

位运算(Bitwise Operation)是计算机科学中的底层操作,它直接作用于二进制位,能够极大提升运算效率。在算法竞赛、系统开发、加密技术、图像处理等领域,位运算发挥着重要作用。今天,我们就来聊聊 有趣的位运算技巧,并用 Java 实战演示


1. 为什么要使用位运算?(Why)

相比普通的加减乘除运算,位运算具有以下优势

  • 极致性能:直接操作二进制位,避免 CPU 额外计算,速度比普通算术运算更快
  • 节省空间:位运算可用于状态压缩,如布隆过滤器、权限管理等。
  • 简洁优雅:某些数学运算用位运算能 大幅减少代码量

2. 常见的位运算操作(What)

位运算符 含义 例子(以 53 为例)
& (按位与) 两位都为 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. 互动讨论

👉 你用过哪些有趣的位运算技巧?
👉 你还想了解哪些位运算的高级应用?
💬 欢迎留言讨论,点赞收藏! 🚀