JS中遇到的二进制位运算问题

本文探讨了JavaScript中二进制位运算的问题,指出位运算只对整数生效且会自动转换为32位整数进行操作。在JS中,位运算的数值范围限制在[-2^31, 2^31 - 1],因为第32位作为符号位。文章解释了这个范围的由来,并通过实例展示了位运算如何处理边界情况。" 125317965,10195784,Python多继承与super深入解析,"['Python开发', '编程语言', 'Flask框架']
摘要由CSDN通过智能技术生成

JS中遇到的二进制位运算问题

知识点:

JS中的负值是通过补码来进行保存的,补码的计算流程就是:

  1. 确定绝对值的二进制表示(如,对于-18,先确定18 的二进制表示);
  2. 找到数值的一补数(或反码),换句话说,就是每个0 都变成1,每个1 都变成0;
  3. 给结果加1。

而补码转换回十进制的方法就是:

  1. 补码减1
  2. 按位取反

位运算

遇到过这样一个语句,不是很理解原理:

i = i | 0;

后来在网上找到了资料解释很清晰:二进制位运算符

即位运算符只对整数起作用,如果一个运算子不是整数,会自动转为整数后再执行。

这个语句实现的效果就是将一个浮点数的小数部分忽略。位运算会自动忽略小数部分,与0进行或操作又会返回自身的值,因此达到了这么一个忽略小数的效果。

function toInt32(x) {
   
  return x | 0;
}

toInt32(1.001) // 1
toInt32(1.999) // 1
toInt32(1) // 1
toInt32(-1) // -1
toInt32(Math.pow(2, 32))  // 0
toInt32(Math.pow(2, 32) + 1) // 1
toInt32(Math.pow(2, 32) - 1) // -1

ECMAScript中的所有数值都以IEEE 754 64 位格式存储,但位操作并不直接应用到64 位表示,而是先把值转换为32 位整数,再进行位操作,之后再把结果转换为64 位。

注意这里虽然是位运算最多操作32位整数,但由于默认ECMAScript 中的所有整数都表示为有符号数,所以第32位是符号位,所以实际位运算能正确处理的数值大小只有 [ − 2 31 , 2 31 − 1 ] [-2^{31}, 2^{31}-1] [231,2311]这个范围
其实准确来说应该是 ( − 2 31 − 1 , 2 31 ) (-2^{31}-1, 2^{31})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值