刘明野

JS运算符中 >> 和 >>> 的区别和应用

右移运算符(right shift):符号为>>
带符号位的右移运算符(zero filled right shift):符号为>>>

右移运算符

右移运算符(>>)表示将一个数的二进制值向右移动指定的位数,头部补0,即除以2的指定次方(最高位即符号位不参与移动)。

4 >> 1
// 2

// 因为4的二进制形式为 00000000000000000000000000000100,
// 右移一位得到 00000000000000000000000000000010,
// 即为十进制的2

-4 >> 1
// -2

// 因为-4的二进制形式为 11111111111111111111111111111100,
// 右移一位,头部补1,得到 11111111111111111111111111111110,
// 即为十进制的-2

右移运算可以模拟 2 的整除运算。

5 >> 1
// 2
// 相当于 5 / 2 = 2

21 >> 2
// 5
// 相当于 21 / 4 = 5

21 >> 3
// 2
// 相当于 21 / 8 = 2

21 >> 4
// 1
// 相当于 21 / 16 = 1

右移运算可以用来取整

123.456 >> 0
// 123

-123.456 >> 0
// 123

带符号位的右移运算符

带符号位的右移运算符(>>>)表示将一个数的二进制形式向右移动,包括符号位也参与移动,头部补0。所以,该运算总是得到正值。对于正数,该运算的结果与右移运算符(>>)完全一致,区别主要在于负数。

4 >>> 1
// 2

-4 >>> 1
// 2147483646

// 因为-4的二进制形式为11111111111111111111111111111100,
// 带符号位的右移一位,得到01111111111111111111111111111110,
// 即为十进制的2147483646。

这个运算实际上将一个值转为32位无符号整数。
查看一个负整数在计算机内部的储存形式,最快的方法就是使用这个运算符。

-1 >>> 0 // 4294967295

上面代码表示,-1作为32位整数时,内部的储存形式使用无符号整数格式解读,值为 4294967295(即(2^32)-1,等于11111111111111111111111111111111)。

参考资料:

http://javascript.ruanyifeng.com/grammar/operator.html#toc26
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators

本文为作者刘明野发布,未经允许禁止转载!
4973
1
0
发表留言

    剑豪
    3月前

    赞,讲的很详细,例子很丰富,容易理解!

友情链接