题目
颠倒给定的 32 位无符号整数的二进制位。
输入:n = 11111111111111111111111111111101 输出:3221225471 (10111111111111111111111111111111)
题解
第一种
首先我们在函数中先定义了一个空数组reverseBinary
变量和变量number
和t
,number
和t
分别用于记录翻转后的十进制数和二进制位的权值。然后使用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; };