题目
颠倒给定的 32 位无符号整数的二进制位。
输入:n = 00000010100101000001111010011100 输出:964176192 (00111001011110000010100101000000) 解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596, 因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
思路一
我们已知有符号数是利用二进制最高位表示符号,0代表正,1代表负无符号为表示的是最高位的0、1代表正常的数,而不是符号,所以我们可以使用位运算符进行实现,先声明一个res变量默认为0,然后使用循环进行循环32次,在循环中我们每次都取末尾值使用位运算符计算后相加存储到res变量中,然后再使用位运算符对n形参进行更新,最后使用位运算符将res和0运算过后的结果返回出去
var reverseBits = function(n) { let res = 0 for(let i = 0;i<32;i++){ res = (res << 1) + (n & 1); n >>= 1; } return res>>>0 };
思路二
我们先将n形参使用toString方法转为二进制数,然后再使用split方法获得数组,在使用reverse方法进行倒序排列,在使用join方法将将数组转为字符串,最后使用padEnd方法补齐位数,最后通过parseInt方法将二进制数转为十进制数,最后返回出去即可
var reverseBits = function(n) { return parseInt(n.toString(2).split('').reverse().join('').padEnd(32,'0'), 2); };
思路三
我们先创建result变量以及count变量,默认值都为0,在声明循环,循环值循环32次,我们每循环一次都用count进行记录,我们在循环中判断n形参是否存在,如果存在则将当前n形参余2之后赋值给temp变量,然后再更新result变量和形参n,如果不存在则将result变量乘2并重新赋值给自己,每次循环都将count变量自增1,最后将result变量返回出去即可
var reverseBits = function(n) { let result = 0; let count = 0; while(n || count < 32) { if (n) { let temp = n % 2; result = result * 2 + temp; n = Math.floor(n / 2); } else { result = result * 2; } count++; } return result; };