题目
颠倒给定的 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;
};
坚持努力,无惧未来!