【发布时间】:2015-02-08 01:07:45
【问题描述】:
我写了一个递归方法,它接受一个数字,并返回二的下一个幂。如果输入的数字是 2 的幂,它将映射到自身。这假定 n > 0
static int nextPower1(int n) {
if(n == 0) {
System.out.println("nextPower(" + n + ") = 2");
return 2;
} else if(n == 1) {
System.out.println("nextPower(" + n + ") = 1");
return 1;
} else {
int lastBit = n & 1;
int secondLastBit = (n >> 1) & 1;
int restOfTheBits = (n >> 2);
int result = nextPower1(restOfTheBits << 1 | secondLastBit ^ lastBit);
return result << 1;
}
我不明白的是,对最后两位进行异或并设置倒数第二位如何返回正确的二的幂?这个按位技巧是如何工作的?
大编辑:
好的,我知道哪里出了问题,通过更新基本案例并将 XOR 更改为 OR,我认为它已修复。 我把它放在一个循环中来测试它。循环检查 2 从 Integer.MAX_VALUE 到 Integer.MAX_VALUE 的幂。它从 Integer.MIN_VALUE 返回了至少 (1
static int nextPower2(int n) {
if(n == 3) {
return 4;
} else if(n < 4) {
return 1 << (n >> 1);
} else {
return nextPower(((n >> 2) << 1) | ((n >> 1) & 1) | (n & 1)) << 1;
}
}
【问题讨论】:
-
Power of 2 formula help 的可能重复项
-
您在不了解 xoring 的工作原理的情况下编写了此代码?我在这里有点困惑。
-
“这假定 n > 0”。那你为什么要把 n=0 的结果编码为 2 呢?不应该是 2 次方 0 = 1 吗?
-
此代码不正确。它返回 4 作为 7 的 2 的下一个幂。它返回 8 代表 13 和 14。
-
为 n=1 返回 1 使代码正确。
标签: java binary bit-manipulation