JavaScript的位运算,右移0位的作用

碰到一段代码,代码的功能是将十进制的-5转换成无符号二进制的格式。

对将dec右移0位这句不太懂。记录一下分析过程。结尾是[太长不看]版本

<script>
document.getElementById("demo").innerHTML = dec2bin(-5);
function dec2bin(dec){
  return (dec>>>0).toString(2);
}
</script>

查了一下>>>0 的意思 [无符号移位:该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。(即便右移 0 个比特,结果也是非负的。)]

那首先明确几个点,

1 JavaScript中数字存储格式是64位浮点数

2 JavaScript中进行位运算的数字格式是32位二进制数

3 负数的二进制写法是正数的二进制补码+1

4 这种长位数作运算的时候会用16进制来表示,即四位变成一位,用0x作开头

toString(2)可以将十进制转换成二进制,带正负号。。

代码中 dec= -5,

接下来手动算一下-5的二进制无符号整数值

+5的二进制格式:101

补成32位: 0000 0000 0000 0000 0000 0000 0000 0101,

补码:1111 1111 1111 1111 1111 1111 1111 1010,

加一:  1111 1111 1111 1111 1111 1111 1111 1011(这个是我们最后需要得到的二进制数)

那么dec>>>0不是就可以获得二进制无符号整数了吗,这里为什么要加一个.toString(2)呢?

原因在于存储格式,上面那个最终结果的十六进制表达形式是:0xFFFFFFFB

这个16进制也是无符号的,如果直接输出dec>>>0的值,会得到上述十六进制被转换成十进制整数的‭4294967291。

这个写法不是我们需要的二进制值,要在写一步toString(2),转换成二进制格式的字符串进行输出。

最终输出

11111111111111111111111111111011

和我们前面计算的结果一样。

 

总结一下转换过程

1 dec>>>0,通过位运算,将存储的64位浮点数转换成32位二进制数,用十六进制的十进制表示来记录(太绕了)。

2 .toString(2),把这个十进制转换成二进制格式的字符串进行输出。

 

参考:

https://segmentfault.com/a/1190000014613703

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值