我需要使用按位/位移运算符查找梅森数的帮助。 对于程序的每次运行,程序都会检查由常量定义的给定数字范围。
Example : the range 3430..3440.
我查了一下互联网,得到了梅森数的这个性质:梅森数在二进制表示中仅由 1 组成。第一个数字是 1、3、7、15、31、63、127。
如何使用 java 的位移运算符和逻辑运算符检查梅森数?
请帮助我。提前致谢!
最佳答案
通过获取前一个梅森数并在任意位置附加/前置/放置 1,可以轻松列出梅森数:
long nextMersenne(long previous) {
return (previous << 1) | 1;
}
您可以通过将最左边的下注向右“扫”,将所有内容设置在其路径中,找到不小于给定数字的最低梅森数字,例如
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,这发生在枚举适合 的最高梅森数之后>long
,如果你想走得更高,你可以用更烦人的语法(使用 BigInteger
)来完成同样的事情。
关于java - 使用按位运算符检查 JAVA 中的梅森数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43806028/