颠倒二进制位
位运算分治
-
解题思路:
-
图解:
-
复杂度:
- 时间复杂度:O(1);
- 空间复杂度:O(1);
-
代码实现:
var reverseBits = function (n) { //低16位与高16位交换 // ffff ffff 右移16位,变成 0000 ffff // ffff ffff 左移16位,变成 ffff 0000 n = (n >>> 16) | (n << 16); //每16位中低8位和高8位交换 n = ((n & 0xff00ff00) >>> 8) | ((n & 0x00ff00ff) << 8); //每8位中低4位和高4位交换 n = ((n & 0xf0f0f0f0) >>> 4) | ((n & 0x0f0f0f0f) << 4); //每4位中低2位和高2位交换 n = ((n & 0xcccccccc) >>> 2) | ((n & 0x33333333) << 2); //每2位中低1位和高1位交换 n = ((n & 0xaaaaaaaa) >>> 1) | ((n & 0x55555555) << 1); return n >>> 0; };
迭代颠倒
-
解题思路:
- res 初始值为 0,每次把 res 左移,把 n 的二进制末尾数字,拼接到结果 res 的末尾;
- 然后把 n 右移,不断去掉 n 末尾的数字;
-
图解:无符号右移
-
复杂度:
- 时间复杂度:O(1);
- 空间复杂度:O(1);
-
代码实现:
JSTSvar reverseBits = function (n) { let res = 0; for (let i = 0; i < 32; i++) { // res 左移一位,加上 n 的最后一位 res = (res << 1) | (n & 1); // n 每次右移一位 n >>= 1; } // x >>> 0本质上就是保证x有意义(为数字类型),且为正整数,且在无意义的情况下缺省值为0 return res >>> 0; };
function reverseBits(n: number): number { let res = 0; for (let i = 0; i < 32; i++) { // res 左移一位,加上 n 的最后一位 res = (res << 1) | (n & 1); // n 每次右移一位 n >>= 1; } // x >>> 0本质上就是保证x有意义(为数字类型),且为正整数,且在无意义的情况下缺省值为0 return res >>> 0; };
打赏作者
您的打赏是我前进的动力
微信
支付宝
7.整数反转
上一篇
评论