JavaScript 當整數超過32位最大值時的異或算法


問題描述:

在一個把JS代碼轉換為C#代碼時碰到一個問題

數值1: -1197179797 

數值2: 84941944608  (超過32位最大值 2147483647)

用JS異或結果是: 2118863691

用C#異或結果是: -83780482229

解決過程:

經測試 JS中如果整數內存大於32位時, JS會自動屏蔽掉32位以后字節

JS: 0^0x100000001 結果是 1  而不是 0x100000001,因為首位的1位於第33字節 自動被忽略掉了,所以結果是1

在C#中異或是以Long 64位長度異合, 因此兩者結果不一樣

解決方法:

通過C#實現JS中效果的解決方法 

如果異或的數num大於0xFFFFFFF, 就把32位以后去掉

1.num = num & 0xFFFFFFFFL, 把32位以后置0

此時如果直接強制轉換 符號位會被替換, 可直接通過內存轉換

2.BitConverter.ToInt32(BitConverter.GetBytes(num), 0);

通過這2步之后結果就和JS中 0^num 的效果一樣了.

然后再用這個結果拿另外一個數異或..搞定


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM