我正在尝试用 Java 重写这个 Javascript 函数:
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
我的 Java 改编:
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
当我通过
-1954896768
, Javascript 版本返回 70528
, 而 Java 返回 -896768
.我不确定为什么。差异似乎始于 if 条件内部:在 if encodingRound2 = 2340070528
之后的 Javascript 函数中, 在 Java 中:encodingRound2 = -1954896768
.我制作了这些回复以在线显示:
Javascript:https://repl.it/repls/NumbGuiltyHack
java :https://repl.it/repls/ClumsyQualifiedProblem
编辑 : 将 Java 函数更改为此
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return (encondindRound2 % 1_000_000);
}
似乎不影响结果 - 它仍然是
-896768
最佳答案
在 Java 中,0x80000000 超出了 32 位 int 的范围,因此它回绕到 -2147483648。
在 JavaScript 中,0x80000000 完全在 64 位 double 的范围内,所以它仍然是 2147483648。
显然,添加 -2147483648
与添加 2147483648
导致非常大的差异。
您可以使用 long
Java 中的 0x80000000L,或使用 (0x80000000|0)
将您的 JS 编号强制转换为 32 位整数,取决于你想要的。
关于用 Java 重写的 Javascript 函数给出了不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59994440/