由上一篇leetcode题目(反转整数)中所涉及到的js整型范围,针对js如何处理32位整数运算原理以作扩展:
1、32位整数运算
首先要清楚,在JS中无论是整数还是小数都是按照64位的浮点数形式存储,而整数运算会自动转化为32位有符号整数。
有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数。数值范围为 [-2^31 , 2^31-1], 即[ -2147483648 , 2147483647 ]。
JavaScript 进行位操作时,采用32位有符号整型,这意味着其转换的结果也是32位有符号整型。 有时我们进行移位会由于符号的存在产生与c语言无符号整数不一样的结果。
针对该问题,我们可以把JavaScript 中的有符号数,转换成无符号数。只需要进行 >>>0
移位操作就好了。
2、超过32位整数运算
当我们要进行大数运算时,超出范围的高字节部分会被截掉,此时该如何处理?
由于JS每次最多只能处理32位的位运算,那么对于大数我们可以采用分段来处理,使得每一段都在范围之内。
var longN = 0xfffffffff; //超长数
var shortN = 0x0ffffff0; //标准数
var tool = 0x000000ff; //用于截取指定位置(最低位字节)数据的工具数
var t_long = longN & tool; //保存超长数最低字节数据
var t_short = shortN & tool; //保存标准书最低字节数据
var t_r = t_long ^ t_short; //保存最低字节数据异或结果
var offset = Math.pow(2,tool.toString(16).length * 4);
longN = Math.floor(longN / offset); //将超长数已处理的数据部分移出,目的是将32位以外的那一个字节移进来
//!!!注意,这里不要使用parseInt,因为会使64位转为32位
shortN = Math.floor(shortN / offset); //同上
var t_h = longN ^ shortN; //保存剩余未处理的数据异或的结果
t_h *= offset; //将结果左移回到原来的对应位
var result = t_h + t_r //整合结果
console.log(result.toString(16)); //ff000000f