Java 如何检查间隔是否包含2的幂
我正在研究Java。我想在以下方面得到一些帮助。所以,给定一个特定的区间(int-low,int-high),我们如何检查它是否包含任何2的幂的数?我检查数字是否为2的幂的方法是:Java 如何检查间隔是否包含2的幂,java,Java,我正在研究Java。我想在以下方面得到一些帮助。所以,给定一个特定的区间(int-low,int-high),我们如何检查它是否包含任何2的幂的数?我检查数字是否为2的幂的方法是: private static boolean isPowerOfTwo(int n){ if( n == 0 || n == 1){ return false; } else if( (n & -n) == n ){ return true; }
private static boolean isPowerOfTwo(int n){
if( n == 0 || n == 1){
return false;
} else if( (n & -n) == n ){
return true;
}
else{
return false;
}
}
我所做的检查间隔中是否有二次幂的数字的方法是:
private static boolean ContainsPowerOfTwo(int low, int high){
boolean f = false ;
if (isPowerOfTwo(low) || isPowerOfTwo(high)){
return true;
}
for (int i = low; low <= high; i++){
if ( (low & -low ) == low && low!=0 && low!=1 ) {
f = true;
break;
}
}
if ( f == true ){
return true;
}else{
return false;
}
}
private静态布尔值包含poweroftwo(int-low,int-high){
布尔f=假;
如果(isPowerOfTwo(低)| | isPowerOfTwo(高)){
返回true;
}
对于(int i=low;low,它看起来像代码:
for (int i = low; low <= high; i++){
if ( (low & -low ) == low && low!=0 && low!=1 ) {
f = true;
break;
}
}
for(inti=low;low您可以使用长函数来简化此过程
public static boolean powerOf2InRange(long low, long high) {
return Long.bitCount(low) == 1 ||
Long.bitCount(high) == 1 ||
Long.highestOneBit(low) != Long.highestOneBit(high);
}
如果您只需要评估二次幂的存在性,而不需要评估其值,那么使用以下方法就足够了:
不检查给定区间内所有值的方法有点不同。因为函数幂-2严格增加,我取了区间限制的log2并检查了它们
public class Main {
public static void main(String[] args) {
containsPowerOfTwo(43, 64);
containsPowerOfTwo(31, 63);
containsPowerOfTwo(32, 63);
containsPowerOfTwo(33, 63);
containsPowerOfTwo(33, 64);
containsPowerOfTwo(55, 127);
containsPowerOfTwo(56, 128);
containsPowerOfTwo(34, 127);
}
private static boolean containsPowerOfTwo(int low, int high) {
double log2Low = log2(low);
// System.out.println("log2Low: " + log2Low);
double log2High = log2(high);
// System.out.println("log2High: " + log2High);
double floorlog2Low = Math.floor(log2Low);
// System.out.println("floorlog2Low: " + floorlog2Low);
double floorlog2High = Math.floor(log2High);
// System.out.println("floorlog2High: " + floorlog2High);
boolean retVal = log2High == floorlog2High || log2Low == floorlog2Low || floorlog2High - floorlog2Low >= 1;
System.out.println(String.format("%d - %d %B ",low ,high, retVal));
return retVal;
}
private static double log2(int value) {
return Math.log(value) / Math.log(2);
}
}
输出:
43 - 64 TRUE
31 - 63 TRUE
32 - 63 TRUE
33 - 63 FALSE
33 - 64 TRUE
55 - 127 TRUE
56 - 128 TRUE
34 - 127 TRUE
为什么你有isPowerOfTwo(int)
return false表示1?1绝对是2的幂。是的,你说的是正确的。我的错,谢谢。我现在更改了它。检查这个魔术与问题无关,但是关于编码风格:if(condition){return true;}else{return false;}
可以用更简单的返回条件替换
。也要避免if(flag==true)
。很容易犯类似if(flag=true)
这样的错误,我们将true
指定给标志
使整个表达式计算为true
。最好编写if(flag)
或使用Yoda风格的if(true==flag)
-因为我们将无法使用true=…
为true
分配任何内容。非常感谢,我会记住它。有趣的是,我在两分钟前犯了这个错误if(flag=true)
,并自己更正了它!该死……是的,这就是我的意思。(我很好,做得很好。希望我能帮助你找到解决办法。是的,我真的很感谢你告诉我这些事情。有时候,即使你知道什么是对的,什么是错的,但要真正找到自己的错误似乎很难!是的,现在我想起来了,你是对的。事情就是这样,即使虽然这听起来有点愚蠢,但我还没有学过这个,所以我不确定是否应该使用它。我只是来这里输入这个解决方案,但“显然”太迟了。呵呵。=)
public class Main {
public static void main(String[] args) {
containsPowerOfTwo(43, 64);
containsPowerOfTwo(31, 63);
containsPowerOfTwo(32, 63);
containsPowerOfTwo(33, 63);
containsPowerOfTwo(33, 64);
containsPowerOfTwo(55, 127);
containsPowerOfTwo(56, 128);
containsPowerOfTwo(34, 127);
}
private static boolean containsPowerOfTwo(int low, int high) {
double log2Low = log2(low);
// System.out.println("log2Low: " + log2Low);
double log2High = log2(high);
// System.out.println("log2High: " + log2High);
double floorlog2Low = Math.floor(log2Low);
// System.out.println("floorlog2Low: " + floorlog2Low);
double floorlog2High = Math.floor(log2High);
// System.out.println("floorlog2High: " + floorlog2High);
boolean retVal = log2High == floorlog2High || log2Low == floorlog2Low || floorlog2High - floorlog2Low >= 1;
System.out.println(String.format("%d - %d %B ",low ,high, retVal));
return retVal;
}
private static double log2(int value) {
return Math.log(value) / Math.log(2);
}
}
43 - 64 TRUE
31 - 63 TRUE
32 - 63 TRUE
33 - 63 FALSE
33 - 64 TRUE
55 - 127 TRUE
56 - 128 TRUE
34 - 127 TRUE