java - 使用按位运算符检查 JAVA 中的梅森数

标签 java bitwise-operators

我需要使用按位/位移运算符查找梅森数的帮助。 对于程序的每次运行,程序都会检查由常量定义的给定数字范围。

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/

相关文章:

java - 如何更改 java DNS 服务提供商

java - 将字节数组转换回公钥

java - 如何使用 retrofit2 接收 Json 数组 ("result")

c++ - 位运算 OR 与加法

python - 从十六进制字符串中提取各个位值的有效方法

java - 加快 HashMap 写入速度

java - 在 Java 8 中映射自定义 List 对象的 1 个以上属性

javascript - 为什么 ~5 === -6 在 JavaScript 中?

c - 如何从下面提到的字符串格式中获取 '3 bits' 字段

JavaScript 的异或结果与 Java 的结果不同