簡介
我們知道 \(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