C'è questa funzione Javascript che sto cercando di riscrivere in Java:
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
Il mio adattamento Java:
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
Quando passo -1954896768, la versione di Javascript ritorna 70528, mentre Java ritorna -896768. Non sono sicuro del perché. La differenza sembra iniziare all'interno del se la condizione: in funzione Javascript dopo il caso encodingRound2 = 2340070528, mentre in Java: encodingRound2 = -1954896768.
Ho fatto queste sostituzioni per mostrarlo online:
Javascript : https://repl.it/repls/NumbGuiltyHack
Java : https://repl.it/repls/ClumsyQualifiedProblem
EDIT : Modifica della funzione Java in questo
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return (encondindRound2 % 1_000_000);
}
non sembra influenzare il risultato - è ancora -896768
longdato risultati diversi, a causa dell'overflow.
(int)cast dalla returnlinea non cambia il risultato Java, rimane-896768
... + 0x80000000, Java converte il valore in un int, perché 0x80000000è considerato un letterale int. Cambia quel numero in 0x80000000L.
encondindRound2in unintcodice Java? Dal momento che è definito come along, potresti perdere potenzialmente la precisione se lo esegui su un tipo più stretto.