用Java计算x的y次幂x^y以及位运算计算2^n

Posted 剑道子羽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用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

以上是关于用Java计算x的y次幂x^y以及位运算计算2^n的主要内容,如果未能解决你的问题,请参考以下文章

用java编写程序计算x的n次幂

计算机组成原理定点数运算

javascript 如何计算几次方

面试之leetcode分治-求众数,x幂等

求补码一位乘(booth乘法 比较法)计算x=11011y=-11111求x*y的详细过程

python常用函数及模块