用Java计算x的y次幂x^y以及位运算计算2^n
简介
我们知道 表示 x的y次幂。特殊地, 表示 2的n次方,或者叫 2的n次幂。
1.计算 x 的 y次幂
易踩坑1: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} - 1 |
long | 64 | ~ 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时,涉及到 的结果运算。
易踩坑: 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix