問題描述:
在一個把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 的效果一樣了.
然后再用這個結果拿另外一個數異或..搞定