JS算法-颠倒二进制位

271 阅读2分钟

题目

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

输入:n = 11111111111111111111111111111101
输出:3221225471 (10111111111111111111111111111111)

题解

第一种

首先我们在函数中先定义了一个空数组reverseBinary变量和变量numbertnumbert分别用于记录翻转后的十进制数和二进制位的权值。然后使用while循环将十进制数n转换为二进制数,并将每一位存入reverseBinary数组中,此时数组中的元素是从低位到高位排列的,接下来判断reverseBinary数组的长度是否为32,如果不足32位,则在数组的前面添加0,使其长度达到32位,最后使用forEach循环遍历reverseBinary数组,计算翻转后的十进制数,即将每一位二进制数乘以对应的权值,然后累加到number变量中,最后返回number即可

var reverseBits = function (n) {
  var reverseBinary = [];
  var number = 0, t = 1, i;
  while (n) {
    reverseBinary.unshift(n % 2);
    n = Math.floor(n / 2);
  }
  if (reverseBinary.length < 32) {
    let len = 32 - reverseBinary.length;
    for (i = 0; i < len; i++) {
      reverseBinary.unshift(0);
    }
  }
  reverseBinary.forEach(function (value) {
    number += value * t;
    t *= 2;
  })
  return number;
};

第二种

将整数n转换成二进制形式。使用toString(2)方法将整数转换成二进制字符串,如果转换后的二进制字符串长度小于32,使用while循环在字符串左侧补0,直到长度为32。这样可以确保所有的二进制字符串都是32位的,将32位二进制字符串n转换成数组形式,便于后面的遍历操作,遍历二进制字符串数组n,当数组元素为1时,使用Math.pow(2,i)方法计算该位的值,将所有计算出的值累加到sum变量中,最后返回sum变量,即为反转后的32位无符号整数

var reverseBits = function (n) {
  n = n.toString(2);
  while (n.length < 32) {
    n = '0' + n;
  }
  n = n.split('');
  var sum = 0;
  for (var i = 0; i < n.length; i++) {
    if (n[i] == '1') sum += Math.pow(2, i);
  }
  return sum;
};

坚持努力,无惧未来!