JS移位运算符
每次看到移位运算符的时候,脑子都会懵一会儿。原因还是没有什么理解位移运算。今天好好学习梳理下相关的知识点。
1: << 运算符-左移运算符
“<<”运算符执行左移位运算。在移位运算过程中,符号位始终保持不变。如果右侧空出位置,则自动填充为 0;超出 32 位的值,则自动丢弃。
console.log(5 << 2); //返回值20
2: >> 运算符-右移运算符
与左移运算符的移动方向相反,它把 32 位数字中的所有有效位整体右移,再使用符号位的值填充空位。移动过程中超出的值将被丢弃。
console.log(1000 >> 8); //返回值3
我们看看符号为1的情况,就是负数的情况。
console.log(-1000 >> 8); //返回值 -4
如图所示。当符号位值为 1 时,则有效位左侧的空位全部使用 1 进行填充。
这里需要补充一个知识点: 负数是如何在计算机中表示的?
在计算机中,负数以原码的补码形式表达。
- 什么是原码: 一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补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