Java 如何检查间隔是否包含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; }

我正在研究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;
    }
    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