关于javascript的按位移动操作符

2019-07-25  本文已影响0人  静影沉璧90

一、前置知识

1、二进制中的原码、反码、补码的生成规则:(以100为例)

原码: 0000 0000 0110 0100

反码:1111 1111 1001 1011

求反规则

补码:1111 1111 1001 1100  = 1111 1111 1001 1011(反码)+ 1

二进制加法规则(逢二进一)

注意:在计算机中,负数以其正值的补码形式表达,方法为其绝对值求反加一;

2、二进制中,如果是有符号的表示,则第一个位为符号位,0表示正数,1表示负数。

二、按位移动操作符:

<<       左移

>>       有符号右移

>>>     无符号右移

按位移动操作符有两个操作数:一个是被移动的数字,一个要移动的长度。移动的方向根据操作符的不同而不同;

按位移动操作符会先将操作数转换位二进制32位的整数,并返回与左操作数相同类型的结果。右操作数应小于32位,否则只有最低5个字节会被使用;

注意:以下提到的操作数是指被移动的数字整体,不是其中的某一位数

1、左移(<<)

该操作符会将第一个操作数向左移动指定的位数,左侧移出的被丢弃,右侧用0填充;

eg:9 << 2

9转换位二进制:0000 0000  0000 0000 0000 0000 0000 1001

向左移动2位:    0000 0000 0000 0000 0000 0000 0010 0100

转换为10进制: 36

总结:在数字 x 上左移 y 比特得到 x * 2y

2有符号的右移(>>)

该操作符会将第一个操作数向右移动指定的位数,右侧移出的被丢弃,左侧拷贝之前左侧的位来填充。由于新的最左侧位和以前的相同,符号位没有边,所以被称作为符号传播。

eg: 9 >> 2

9转换为二进制:0000 0000  0000 0000 0000 0000 0000 1001

向右移动2位:    0000 0000 0000 0000 0000 0000 0000 0010

转换为10进制:2

eg:  -9 >> 2

-9 转换为二进制: 1111 1111 1111 1111 1111 1111 1111  0111

          绝对值二进制:0000 0000 0000 0000 0000 0000 0000 1001

          取反码:           1111 1111 1111 1111 1111 1111 1111 0110

          取补码:           1111 1111 1111 1111 1111 1111 1111  0111

向右移动2为:       1111 1111 1111 1111 1111 1111 1111 1101

转换为10进制:  -3

          取反码(减1):1111 1111 1111 1111 1111 1111 1111 1100

           取原码:             0000 0000 0000 0000 0000 0000 0000 0011

3、无符号的右移(>>>)

该操作符将第一个操作数向右移动指定的位数,右侧移出的被丢弃,左侧用0填充。因为符号为变成了0,所以总是非负的,即使移动0个比特,结果也是非负的;

对于非负数,有符号的右移和无符号的右移返回的结果是相同的;

eg:9 >>> 2

9转换为二进制: 0000 0000  0000 0000 0000 0000 0000 1001

向右移动2位:     0000 0000 0000 0000 0000 0000 0000 0010

转换为十进制:    2

eg: -9 >>> 2

-9 转换为二进制: 1111 1111 1111 1111 1111 1111 1111  0111

          绝对值二进制:0000 0000 0000 0000 0000 0000 0000 1001

          取反码:           1111 1111 1111 1111 1111 1111 1111 0110

          取补码:           1111 1111 1111 1111 1111 1111 1111  0111

向右移动2位:       0011 1111 1111 1111 1111 1111 1111 1101

转换为十进制: 1073741821

上一篇 下一篇

猜你喜欢

热点阅读