我想帮助使用bitwise / bitshift运算符查找mersenne数。 对于程序的每次运行,程序都会检查由常量定义的给定数字范围。
示例:范围3430..3440。
我检查了互联网并得到了mersenne数字的这个属性:一个Mersenne数字在二进制表示中只包含1。第一个数字是1,3,7,15,31,63,127。
如何使用java和逻辑运算符的bitshift运算符检查mersenne数?
请帮帮我。提前谢谢!
答案 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);
}