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 的效果一样了.

然后再用这个结果拿另外一个数异或..搞定

posted @ 2012-02-26 17:55  Hanf  阅读(4204)  评论(2编辑  收藏  举报
Copyright © 2008-2016 Hanf All Rights Reserved