用Java計算x的y次冪x^y以及位運算計算2^n


簡介

我們知道 \(x^y\) 表示 x的y次冪。特殊地,\(2^n\) 表示 2的n次方,或者叫 2的n次冪

1.計算 x 的 y次冪

易踩坑1:x ^ y

× 之前,在刷算法題時,需要計算 x的y次冪的結果。我們經常用 x^y 在計算機上書面的表示公式 \(x^y\)。於是,我掉進了第一個陷阱!

public class Main {
  public static void main(String[] args) {
    System.out.println(2 ^ 2); // 輸出結果為0
  }
}

在 Java 中,^ 是異或計算符號,而n次冪的計算符號!

異或運算是一種邏輯運算。如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同,異或結果為0。

a b a ^ b
0 0 0
0 1 1
1 0 1
1 1 0

進行異或運算時,首先將左操作數和右操作數轉換為二進制數,然后對每一個二進制位分別進行異或計算。

正確的方法是使用 Math.pow 函數。

public class Main {
  public static void main(String[] args) {
    System.out.println(Math.pow(2, 2); // 輸出結果為4
  }
}

Math 的返回值是 double,其范圍是可以覆蓋 long 和 int 的表示范圍的!

關鍵字 所占位數 范圍
int 32 \(-2^{31}\) ~ 2 ^{31} - 1
long 64 \(-2^{63}\) ~ 2 ^{63} - 1

2.用位運算計算 2 ^ n

比如我想要計算 2 ^ 2,用位運算就是 1 << 2

public class Main {

  public static void main(String[] args) {
    System.out.println(1 << 2); // 輸出結果為 4,正確
  }
}

但是我在學習一致性Hash時,涉及到 \(2^{32}-1\) 的結果運算。

易踩坑: 1 << 32

× 直接用 (1 << 32) - 1 計算我想要的值

public class Main {

  public static void main(String[] args) {
    System.out.println(1 << 32);  // 輸出結果為1
    System.out.println((1 << 32) - 1); // 輸出結果為0
  }
}

因為1左移32位,超出了 int 的表示范圍

正確的方法是使用 long 作為被除數。

public class Main {

  public static void main(String[] args) {
    System.out.println(1L << 32);  // 輸出結果為4294967296,正確
    System.out.println(new BigDecimal(2).pow(32)); // 輸出結果為4294967296,正確
  }
}

long value = (1L << 32) - 1; // 結果為 4294967295


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM