我们知道 \(x^y\) 表示 x的y次幂。特殊地,\(2^n\) 表示 2的n次方,或者叫 2的n次幂。
× 之前,在刷算法题时,需要计算 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,用位运算就是 1 << 2
public class Main {
  public static void main(String[] args) {
    System.out.println(1 << 2); // 输出结果为 4,正确
  }
}
但是我在学习一致性Hash时,涉及到 \(2^{32}-1\) 的结果运算。
× 直接用 (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
原文:https://www.cnblogs.com/kendoziyu/p/14842260.html