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

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

转载于:https://www.cnblogs.com/hanf/archive/2012/02/26/2368878.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值