Skip to content

LeetCode题解:190. 颠倒二进制位,使用遮罩,JavaScript,详细注释 #308

@chencl1986

Description

@chencl1986

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

解题思路:

  1. 使用只有一个1的二进制数当做遮罩mask,如00000000000000000000000000000001
  2. 循环32次,每次将遮罩向左移动一位,用n & mask即可判断当前位置是否为1。
  3. 使用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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions