使用按位运算符检查JAVA中的mersenne数

时间:2017-05-05 13:18:59

标签: java bitwise-operators

我想帮助使用bitwise / bitshift运算符查找mersenne数。 对于程序的每次运行,程序都会检查由常量定义的给定数字范围。

  

示例:范围3430..3440。

我检查了互联网并得到了mersenne数字的这个属性:一个Mersenne数字在二进制表示中只包含1。第一个数字是1,3,7,15,31,63,127。

如何使用java和逻辑运算符的bitshift运算符检查mersenne数?

请帮帮我。提前谢谢!

2 个答案:

答案 0 :(得分:1)

通过采用之前的梅森数字并在1:

附加/前置/放置它,可以轻松列出梅森数字
long nextMersenne(long previous) {
    return (previous << 1) | 1;
}

你可以通过“扫描”最右边的设置下注来找到最低的Mersenne数字,而不是给定的数字,设置其路径中的所有内容,例如

1001101
1101101
1111101
1111111

您可以像这样计算:

long lowestMersenneNotLessThan(long lowerBound) {
    long x = lowerBound;
    x |= x >> 1;
    x |= x >> 2;
    x |= x >> 4;
    x |= x >> 8;
    x |= x >> 16;
    x |= x >> 32;
    return x;
}

所以你可以从那里开始,然后继续使用第一个函数生成下一个更高的Mersenne数,直到它变得大于上限(或变为-1,这在枚举适合{{{{{ 1}},如果你想要更高,你可以使用long更烦人的语法来做同样的事情。

答案 1 :(得分:0)

BigInteger有一个很好的函数bitCount,它将计算数字中设置的位数。请注意,任何mersenne数加1都只有一位。

public boolean isMersenne(int n) {
    // If it is mersenne (i.e. 2^n -1) then n + 1 will have just ONE set bit.
    return (BigInteger.valueOf(n+1).bitCount() == 1);

}

public void test() {
    int count = 0;
    for ( int i = 1; i < 10000; i++) {
        if ( isMersenne(i)) {
            System.out.println(i + " is mersenne!");
            count += 1;
        }
    }
    System.out.println("There are "+count);
}