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 的效果一样了.
然后再用这个结果拿另外一个数异或..搞定