chencl1986/Blog

LeetCode题解:190. 颠倒二进制位,移动n,JavaScript,详细注释

Opened this issue · 0 comments

原题链接:190. 颠倒二进制位

解题思路:

  1. 循环32次,每次将n向右移动一位,这样就实现了从前向后比较n
  2. 每次都对比n的第一位是否为1,如果是就要将1填入result
  3. 每次循环将result向左移动一位,实现了将n颠倒。
/**
 * @param {number} n - a positive integer
 * @return {number} - a positive integer
 */
var reverseBits = function (n) {
  let result = 0; // 存储结果

  // 32位二进制数,因此需要移动32次
  // 每次将n的左后一位移动到result的第一位
  for (let i = 0; i < 32; i++) {
    // 每次将结果左移一位,将当前数字填入空位
    // 如果将移动放在if语句之后,会导致多移动一位
    result <<= 1;

    // 如果当前n的第一个位置为1,则需要将1填入result
    if (n & 1) {
      // 如果是1,才需要填入1
      // 如果是0,无需填入,当前位置左移后自然是0
      result += 1;
    }

    // n向右移动一位,判断下一个位置
    n >>= 1;
  }

  // 11111111111111111111111111111101,这个Case反转后为负数,需要转换为正数
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Unsigned_right_shift
  return result >>> 0;
};