-
Notifications
You must be signed in to change notification settings - Fork 86
Open
Description
原题链接:190. 颠倒二进制位
解题思路:
- 使用只有一个
1
的二进制数当做遮罩mask
,如00000000000000000000000000000001
。 - 循环32次,每次将遮罩向左移动一位,用
n & mask
即可判断当前位置是否为1。 - 使用
result
存储结果,每次循环将result
向左移动一位,并将n & mask
的结果填入第一位。
/**
* @param {number} n - a positive integer
* @return {number} - a positive integer
*/
var reverseBits = function (n) {
let mask = 1; // 使用一个遮罩,每次判断二进制中的一位是0还是1,将其赋值给result
let result = 0; // 存储结果
// 以此对比32位二进制数
for (let i = 0; i < 32; i++) {
// 每次将结果左移一位,将当前数字填入空位
// 如果将移动放在if语句之后,会导致多移动一位
result <<= 1;
// 判断当前位置是0还是1
if (n & mask) {
// 如果是1,才需要填入1
// 如果是0,无需填入,当前位置左移后自然是0
result += 1;
}
// 将遮罩左移一位,判断下一个位置
mask <<= 1;
}
// 11111111111111111111111111111101,这个Case反转后为负数,需要转换为正数
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Unsigned_right_shift
return result >>> 0;
};
Metadata
Metadata
Assignees
Labels
No labels