碰到一段代码,代码的功能是将十进制的-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作开头
5 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),把这个十进制转换成二进制格式的字符串进行输出。
参考: