使用按位运算符检查 JAVA 中的梅森数
To check mersenne numbers in JAVA using bitwise operator
我需要帮助使用 bitwise/bitshift 运算符查找梅森数。
对于程序的每个 运行,程序都会检查由常量定义的给定数字范围。
Example : the range 3430..3440.
我上网查了一下,得到了这个 属性 的梅森数:一个梅森数在二进制表示中只包含 1。第一个数字是 1、3、7、15、31、63、127。
如何使用 java 的位移运算符和逻辑运算符检查梅森数?
请帮帮我。提前致谢!
BigInteger
有一个很好的函数 bitCount
可以计算数字中设置了多少位。请注意,任何梅森数加 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);
}
梅森数可以很容易地列出,取前一个梅森数和appending/prepending/put-it-wherever一个1:
long nextMersenne(long previous) {
return (previous << 1) | 1;
}
您可以找到不小于给定数字的最低梅森数,方法是 "sweeping" 最左边的设置向右下注,设置其路径中的所有内容,例如
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;
}
所以你可以从这里开始,然后用第一个函数继续生成下一个更高的梅森数,直到它变得大于上限(或变成 -1,这发生在枚举出适合 a 的最高梅森数之后long
,如果你想走得更高,你可以用更烦人的语法做同样的事情 BigInteger
).
我需要帮助使用 bitwise/bitshift 运算符查找梅森数。 对于程序的每个 运行,程序都会检查由常量定义的给定数字范围。
Example : the range 3430..3440.
我上网查了一下,得到了这个 属性 的梅森数:一个梅森数在二进制表示中只包含 1。第一个数字是 1、3、7、15、31、63、127。
如何使用 java 的位移运算符和逻辑运算符检查梅森数?
请帮帮我。提前致谢!
BigInteger
有一个很好的函数 bitCount
可以计算数字中设置了多少位。请注意,任何梅森数加 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);
}
梅森数可以很容易地列出,取前一个梅森数和appending/prepending/put-it-wherever一个1:
long nextMersenne(long previous) {
return (previous << 1) | 1;
}
您可以找到不小于给定数字的最低梅森数,方法是 "sweeping" 最左边的设置向右下注,设置其路径中的所有内容,例如
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;
}
所以你可以从这里开始,然后用第一个函数继续生成下一个更高的梅森数,直到它变得大于上限(或变成 -1,这发生在枚举出适合 a 的最高梅森数之后long
,如果你想走得更高,你可以用更烦人的语法做同样的事情 BigInteger
).