20210329 LeetCode 每日一题(颠倒二进制位)

269 阅读2分钟

题目描述

原题链接:颠倒二进制位

颠倒给定的 32 位无符号整数的二进制位。

示例

输入: 00000010100101000001111010011100
输出: 00111001011110000010100101000000
解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
     因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000

解答

至于把输入转成二进制字符串再操作字符串翻转的方法就不提了。谈下题解区学到的用位运算去解答。

需要了解的前置知识:

  1. 与预算 &
1 & 1 // 1
1 & 0 // 0
0 & 1 // 0
0 & 0 // 0
  1. JavaScript 使用 32 位按位运算数

JavaScript 将数字存储为 64 位浮点数,但所有按位运算都以 32 位二进制数执行。

在执行位运算之前,JavaScript 将数字转换为 32 位有符号整数。

执行按位操作后,结果将转换回 64 位 JavaScript 数。

  1. 有符号右位移 >>

通过从左推入最左位的拷贝来向右位移,并使最右边的位脱落。

//  -65536 的二进制表示为 1000 0000 0000 0001 0000 0000 0000 0000
;-65536 >> 2 // -16384
//  -16384 的二进制表示为 1000 0000 0000 0000 0100 0000 0000 0000

思路:循环取最后一位拼接起来即可

var reverseBits = function (n) {
  let result = 0
  for (let i = 0; i < 32; i++) {
    result = (result << 1) + (n & 1)
    n = n >>> 1
  }
  return result >>> 0
}

参考链接

JavaScript 位运算符