移位运算符

JS移位运算符(<<、>>和>>>)

了解一下移位运算符以及在算法中的应用

“<<”运算符

左移位运算

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

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

“>>”运算符

右移位运算

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

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

把数值 -1000 向右移 8 位,则返回值为 -4。

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

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

“>>>”运算符

无符号右移位运算

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

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

对于负数来说,无符号右移将使用 0 来填充所有的空位,同时会把负数作为正数来处理,所得结果会非常大所以,使用无符号右移运算符时要特别小心,避免意外错误。

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

算法应用

计算2进制中1的个数

1
2
3
4
5
6
7
8
9
10
11
12
13
function NumberOf1(n)
{
if (n===0) return 0;
let count = 0;

for (let i = 0; i < 32; i++) {
if ((n >>> i & 1) === 1){ // 右移并与1进行&运算
count++;
}
}

return count;
}

这里补充一下 & (位与运算)

&为位与运算,将两边转为二进制
进行比较的时候,如果两边数字的长度不够,就从右到左对齐,前面没有的部分补零就好

1
2
// 0bxxx表示一个数为二进制
console.log(0b100010&0b000111) // 000010 - 2
-------------要说再见啦感谢大佬的光临~-------------