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。

aba ^ b
000
011
101
110

进行异或运算时,首先将左操作数和右操作数转换为二进制数,然后对每一个二进制位分别进行异或计算。

√ 正确的方法是使用 Math.pow 函数。

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

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

关键字所占位数范围
int32−231−231 ~ 2 ^{31} - 1
long64−263−263 ~ 2 ^{63} - 1

 

2.用位运算计算 2 ^ n

在Java语言中,可以使用左移运算符(<<)来表示2的n次方。左移运算符可以将一个数的二进制表示向左移动指定的位数,空出的位用0填充。每向左移动一位,相当于原数乘以2的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 << 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

### 实现高精度大整数运算 对于高精度的大整数运算,通常需要借助能够处理任意长度数值的数据结构或库。大多数现代编程语言提供了内置支持或多精度算术库来解决这一问题。 #### 使用Python实现大整数运算 Python自带对大整数的支持,可以轻松完成此操作而无需额外安装包: ```python def high_precision_power(base, exponent): result = pow(base, exponent) return str(result) base = 12345678901234567890 exponent = 100 print(high_precision_power(base, exponent)) ``` 这段代码利用`pow()`函数执行运算并转换成字符串形式输出以便于查看整个结果[^1]。 #### C++中使用GMP库实现大整数运算 当选择C/C++作为开发环境时,推荐使用GNU多精度算术库(GMP),它是一个开源项目专门用于高效地进行大规模数值计算: ```cpp #include <gmpxx.h> #include <iostream> void high_precision_power(mpz_class base, mpz_class exp){ mpz_class result; mpz_pow_ui(result.get_mpz_t(), base.get_mpz_t(), exp.get_ui()); std::cout << "Result is: " << result << "\n"; } int main(){ mpz_class b("12345678901234567890"); mpz_class e(100); high_precision_power(b,e); } ``` 上述程序展示了通过调用`mpz_pow_ui`来进行高效的运算是多么简单。 #### Java中的BigInteger类实现大整数运算 Java标准库也包含了强大的工具——`java.math.BigInteger`,允许开发者直接创建和操纵非常大的整数对象: ```java import java.math.BigInteger; public class Main { public static void main(String[] args) { BigInteger base = new BigInteger("12345678901234567890"); int power = 100; System.out.println("High precision power calculation:"); System.out.println(base.pow(power)); } } ``` 这里采用了`BigInteger`类型的实例方法`.pow(int)`来完成指定数的乘方操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值