关于JS中number位(Bit)操作的一些思考

本文探讨了JavaScript中位操作符在32位带符号整数中的应用,包括利用位与(&)判断奇偶,位或(|)进行取整,以及结合位操作的打标模式。详细解释了32位整数的表示方式,通过实例展示了如何通过位操作进行数值转换和状态标记,简化权限管理等业务场景。
摘要由CSDN通过智能技术生成

  JavaScript中所有的数字都按照IEEE-754标准储存为64位。但是位操作符却是转换为32位数字进行操作的。关于这一点的可用性进行了一些思考。

32带符号整数

  先来复习一下32带符号整数的数据表示方式。在计算机中,所有的数据都是被储存为0和1的序列,数字也不例外。比如数字4,通过二进制转换,储存为100。但是整数在实际业务场景中是存在正负的,如何用01序列来表示一个负数呢。我们可以拿出一个位置,用0或者1来标志这个数字是整数还是负数。

  在JS的32带符号整数中,数字从左边的第一位用于标识正负数(1表示负数,0表示整数)。在用二进制转换完毕后,用0补齐不足32位的部分。比如数字8的二进制为1000。我们先用0补齐到31位0000000000000000000000000001000,然后在左边第一位放上表示正负的位数,8是正数放上0,因此8在32带符号整数中为00000000000000000000000000001000

  而如果我们要表示一个负数,比如-18,我们需要先找到该负数的绝对值1832带符号整数中的01序列,为00000000000000000000000000010010,然我们把所有位上面的数字取反,转为11111111111111111111111111101101。然后我们把它加上1,得到11111111111111111111111111101110就是18在32带符号整数中的表示。我们可以在控制台中验证一下:

console.log(0b11111111111111111111111111101110 | 0); // -18
0b11111111111111111111111111101110; // 4294967278

  在这里0b起头表示后续的数字是以二进制方式来储存。|位操作,表示同等级位上有1个以及以上的1为1,否则为0,因此| 0表示为取原数值。但是因为位操作符建立在32带符号整数的规则上,这里| 0实际上的含义是把前面的数值转换为32带符号整数。因此我们看到我们直接运算0b11111111111111111111111111101110得到的结果是4294967278而不是-18

  位操作符是建立在32位带符号整数操作上进行的,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值