【JavaScript】JS处理32位整型位运算

由上一篇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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值