JS移位运算符

每次看到移位运算符的时候,脑子都会懵一会儿。原因还是没有什么理解位移运算。今天好好学习梳理下相关的知识点。

1: << 运算符-左移运算符

“<<”运算符执行左移位运算。在移位运算过程中,符号位始终保持不变。如果右侧空出位置,则自动填充为 0;超出 32 位的值,则自动丢弃。

console.log(5 << 2);  //返回值20

image.png

2: >> 运算符-右移运算符

与左移运算符的移动方向相反,它把 32 位数字中的所有有效位整体右移,再使用符号位的值填充空位。移动过程中超出的值将被丢弃。

console.log(1000 >> 8);  //返回值3

image.png

我们看看符号为1的情况,就是负数的情况。

console.log(-1000  >> 8);  //返回值 -4

如图所示。当符号位值为 1 时,则有效位左侧的空位全部使用 1 进行填充。

image.png

这里需要补充一个知识点: 负数是如何在计算机中表示的?

在计算机中,负数以原码的补码形式表达。

  • 什么是原码: 一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。

比如

00000000 00000000 00000000 00000101 是 5的 原码;

10000000 00000000 00000000 00000101 是 -5的 原码。  

  • 什么是反码:

正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。(取反操作指:原为1,得0;原为0,得1。(1变0; 0变1))

例如:

正数00000000 00000000 00000000 00000101 的反码还是 00000000 00000000 00000000 00000101 ;

负数10000000 00000000 00000000 00000101每一位取反(除符号位),得11111111 11111111 11111111 11111010。

  • 什么是补码:

  • 正数的补码与原码相同

  • 负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.

例如:

10000000 00000000 00000000 00000101 的反码是:

11111111 11111111 11111111 11111010。

那么,补码为:

11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

所以-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。

  • 整数 -1在计算机中是如何表达的

1: 先取-1的原码:10000000 00000000 00000000 00000001

2: 得反码: 11111111 11111111 11111111 11111110(除符号位按位取反)

3: 得补码: 11111111 11111111 11111111 11111111

可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF

  • 总结

  • 正数的反码和补码都与原码相同。

  • 负数的反码为对该数的原码除符号位外各位取反。

  • 负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1

负数怎么转换为 10进制?

最高位如果为1代表为负数,求值的时候,需要先把二进制的值按位取反,然后 + 1 ,得到负数绝对值的二进制码,然后转换为 10进制,加上负号即可。

>>> 运算符:

“>>>”运算符执行无符号右移位运算。它把无符号的 32 位整数所有数位整体右移。对于无符号数或正数右移运算,无符号右移与有符号右移运算的结果是相同的。

console.log(1000 >> 8);  //返回值3
console.log(1000 >> 8);  //返回值3

对于负数来说,无符号右移将使用 0 来填充所有的空位,同时会把负数作为正数来处理

console.log(-1000 >> 8);  //返回值 -4
console.log(-1000 >>> 8);  //返回值 16777212

image.png

posted @ 2021-06-14 22:43  eastsae  阅读(849)  评论(0编辑  收藏  举报