javaScript中的无符号右移运算符

今天刷leetcode上的题目revert bits的时候,用到了js里的位移操作,然后就出现了问题。题目里给出的数字是32位无符号整数,但是js里默认的整数是32位有符号整数,所以在执行

1
var a = 1 << 31

时, a的值是-2147483648,而不是期望中的2147483648

如果要得到正确的值,就需要用到另一个位操作符:无符号右移运算符 >>>

它与普通的右移运算符的区别只是在右移补位时只补0,而普通的右移操作符对有符号整数进行操作,当符号位为1时补1,符号位为0时补0

当需要将一个有符号数转成无符号数时,使用 >>> 0即可,将一个无符号数转成有符号数,使用<< 0即可

1
2
3
var a = 1 << 31;	//a = -2147483648
var b = a >>> 0; //b = 2147483648
var c = b << 0; //c = -2147483648

知道了>>>操作符之后,这个leetcode问题就很好解决了,顺便把我的答案附上

1
2
3
4
5
6
7
8
9
10
11
12
13
var reverseBits = function(n) {
var m = 0;
var index = 31;
while(n) {
var tmp = n & 1;
if(tmp) {
m = m | (tmp << index);
}
index -= 1;
n = n >>> 1; //注意,使用无符号右移
}
return m>>>0; //m默认是有符号数,强制转换成无符号数
};

Inhalte