Có chức năng Javascript này mà tôi đang cố gắng viết lại bằng Java:
function normalizeHash(encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return encondindRound2 % 1E6;
}
Thích ứng Java của tôi:
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
}
return (((int) encondindRound2) % 1_000_000);
}
Khi tôi vượt qua -1954896768, phiên bản Javascript trả về 70528, trong khi Java trả về -896768. Tôi cung không chăc tại sao. Sự khác biệt dường như bắt đầu bên trong điều kiện if: trong hàm Javascript sau if encodingRound2 = 2340070528, while trong Java : encodingRound2 = -1954896768.
Tôi đã thực hiện những thay thế này để hiển thị trực tuyến:
Javascript : https://repl.it/repls/NumbGuiltyHack
Java : https://repl.it/repls/ClumsyQualifiedProbols
EDIT : Thay đổi chức năng Java thành cái này
public long normalizeHash(long encondindRound2) {
if (encondindRound2 < 0) {
encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
}
return (encondindRound2 % 1_000_000);
}
dường như không ảnh hưởng đến kết quả - nó vẫn -896768
longđã cho các kết quả khác nhau, vì tràn.
(int)cast khỏi returndòng không làm thay đổi kết quả Java, nó vẫn còn-896768
... + 0x80000000, Java chuyển đổi giá trị thành int, vì 0x80000000được coi là int intal. Thay đổi số đó thành 0x80000000L.
encondindRound2chuyển sang mộtintmã Java? Vì được định nghĩa là along, bạn sẽ có khả năng mất độ chính xác nếu bạn chuyển nó sang loại hẹp hơn.