js中<<是什么运算符

JavaScript022

js中<<是什么运算符,第1张

左移运算符 (<<)

说明

<<运算符把 expression1 的所有位向左移 expression2 指定的位数。例如:

var temp

temp = 14 <<2

变量 temp 的值为 56,因为 14 (即二进制的 00001110)向左移两位等于 56 (即二进制的 00111000)。

Javascript 按位左移运算符 (<<) 将表达式数字转换成二进制,之后向左移表达式的位。

result = 【要位移的数字】 <<【位移位数】

按位左移运算符 (<<) 将 【要位移的数字】 的位左移 【位移位数】中指定的位数。 例如:

复制代码 代码如下:

var temp

temp = 14 << 2

/*

14 的二进制是 00111000

00001110 向左位移2位 00111000 = 56

*/

alert(temp)

// 弹出【56】

移位包括有符号左移(<<)、有符号右移(>>)、无符号右移(>>>),其中 js 支持三种移位,PHP只支持前两种移位(没查到第三种),恰好需要PHP进行无符号右移,此处实现一下。先看结果

将数字 $a 向右无符号移动 $n 位

[php] view plain copy

function uright($a, $n)

{

$c = 2147483647>>($n-1)

return $c&($a>>$n)

}

下面是这样做的理由

1、有符号右移的过程

2 >>1

2在计算机中存储的二进制表示为

000000000  00000000  00000000  00000010

向右移动1位,高位补0

000000000  00000000  00000000  00000001

结果为1

-2 >>1

负数的存储是以补码的方式存储的(相关知识自行了解),这里简单说明

符号位是 1,-2的表示为

100000000  00000000  00000000  00000010

补码:除符号位外,其他位按位取反,然后 + 1

11111111  11111111  11111111  11111101

11111111  11111111  11111111  11111110

向右移动1位,高位补1

11111111  11111111  11111111  11111111

结果为 -1(转换成10进制后)

注意:移位操作是按照计算机中实际存储的二进制形式进行移动的

2、无符号右移的过程

2 >>1同上

-2 >>1

补码右移1位,高位补 0

01111111  11111111  11111111  11111111

结果是 2147483647

无符号右移 n 位,即把所有位向右移动 n 位(有符号右移),然后把前 n 位变成 0。

要把前 n 位变成 0 ,只需要让其跟一个前 n 位是 0,后 32-n 位是 1 的数进行按位与就可以了。

构造前 n 位是 0 后 32-n 位是 1 的数:利用正数有符号右移高位补 0 实现,这里用 2147483647 这个正数实现(当然其他数也可以),这个数在计算机中的存储前面已经说了,是

01111111  11111111  11111111  11111111

利用这个数构造前 n 位是 0  的数,只需将其向右移动 n-1 位就行了

-2 无符号右移 2位的过程

-2右移2位:11111111  11111111  11111111  11111111

构造数:     00111111  11111111  11111111  11111111

按位与:     00111111  11111111  11111111  111111