一文了解按位操作符中左移与右移

无意中看到>>、<<、>>>说实话一点也不知道这是什么,带着好奇心去了解了一下。
本文从一个小白的角度看这三个按位操作符的意思,会相对好理解。

按位操作符操作数字的二进制形式,但是返回值依然是标准的JavaScript数值。

>>(有符号位移):

用法:a>>b
描述:把a转化为二进制数并向右位移b(注:b<32)位(bit),右移出的数被抛弃,并复制最左侧的数填充左侧,由于新的最左侧的位总是和以前相同,符号位没有被改变。所以被称作“符号传播”
例子:
console.log(5<<2) 将5转成二进制:0000 0101
但是计算机存储数字时是32位,也就是:00000000000000000000000000000101
向右移2位:00000000000000000000000000000001,并且最左侧是0所以在左侧补上0,最后返回1
还有一种负数的情况:
console.log(-5<<2) 将-5转成二进制补码:1111 1011
也就是:11111111111111111111111111111011
向右移2位:11111111111111111111111111111110,最左侧是1所以在左侧补上1,最后返回-2

为什么说b<32位呢,主要是5<<32返回5,5<<33==5<<1是一样的,可以自己试一下

什么是补码?

先说什么是补码:
原码:将一个整数,转换成二进制,就是其原码。如1字节(8位)的5的原码为:0000 0101;-5的原码为1000 0101。
反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。-5的反码为1111 1010。
补码:正数的补码就是其原码;负数的反码+1就是补码。 如单字节的5的补码为:0000 0101;-5的原码为1111 1011。
想深入了解补码的点这里

取反+1怎么理解?

例如:
取反+1,就是补码
5+(-5)=0,5=0000 0101,5取反=1111 1010 再加1,所以-5=1111 1011。取反(反码)就是把0换成1,1换0,补码就再加1
如果还想知道为什么,可能就是想明白1+1为什么等于2了

为什么叫有符号位移?

通过原码发现最左侧可能就是所说的符号位(只是个人通过表现的猜测),这一位表示负数还是正数。向右移动,左侧补码会有两种情况:
1.负数使用>>,符号位是1所以左侧会补1
2.正数使用>>,符号位是0所以左侧会补0
这也就是为什么上面说过复制最左侧的符号位填充左侧,保留数据的正或负(理解为保留正负号吧)。

>>>(无符号位移):

用法:a>>>b
描述:把a转化为二进制数并向右位移b(注:b<32)位(bit),最左边用0补充
例子:
console.log(5>>>2) 将5转成二进制就是:0000 0101
也就是:00000000000000000000000000000101
向右移2位:00000000000000000000000000000001,并且最左侧补上0,最后返回1
来个负数的:
console.log(-5>>>2) 将-5转成二进制补码:1111 1011
也就是:11111111111111111111111111111011
向右移2位:00111111111111111111111111111110,并且最左侧补上0,最后返回1073741822
无符号位移>>>,无论正数负数都是最左侧填充0
因为符号位变成了0,所以结果不为负数(即便右移0位,结果也是非负的)

<<:

用法:a<<b
描述:把a转化为二进制数并向左位移b(注:b<32)位(bit),右边用0补充
例子:
console.log(5<<2) 将5转成二进制也就是:0000 0101
也就是:00000000000000000000000000000101
向左移2位:00000000000000000000000000010100,并且补上0,最后返回20

为什么没有<<<?

<<代表二进制向左移,右边补0
如果真的有<<<也是向左移,右边也是补0。所以没有第二个情况,就不需要多此一举啦。

我理解的很浅显,但还是明白这是干啥得了,如有错请指出。

扫描二维码关注公众号,回复: 8501765 查看本文章
发布了31 篇原创文章 · 获赞 45 · 访问量 5908

猜你喜欢

转载自blog.csdn.net/weixin_43623808/article/details/102713736