Existe esta función Javascript que estoy tratando de reescribir en Java:
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
Mi adaptación de Java:
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
Cuando paso -1954896768, la versión de Javascript regresa 70528, mientras que Java regresa -896768. No estoy seguro de por qué. La diferencia parece comenzar dentro de la condición if: en función Javascript después de que el caso encodingRound2 = 2340070528, mientras que en Java: encodingRound2 = -1954896768.
Hice estas respuestas para mostrarlo en línea:
Javascript : https://repl.it/repls/NumbGuiltyHack
Java : https://repl.it/repls/ClumsyQualifiedProblem
EDITAR : Cambiar la función de Java a esto
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return (encondindRound2 % 1_000_000);
}
no parece afectar el resultado, sigue siendo -896768
longdio resultados diferentes, debido al desbordamiento.
(int)lanzamiento de la returnlínea no cambia el resultado de Java, permanece-896768
... + 0x80000000, Java convierte el valor en int, porque 0x80000000se considera que es un literal int. Cambia ese número a 0x80000000L.
encondindRound2a unintcódigo Java? Como se define como along, potencialmente perderá precisión si lo convierte en un tipo más estrecho.