190. 颠倒二进制位【简单】

leetcode:https://leetcode-cn.com/problems/reverse-bits/

 

 

 

方法一:

位运算

从末尾开始逐渐遍历,然后累积计算

/**
 * @param {number} n - a positive integer
 * @return {number} - a positive integer
 */
var reverseBits = function(n) {
    let res = 0;
    // 循环遍历32次,依次出去当前数字末尾的数字,累积计算
    for (let i = 0; i < 32; i++) {
        let num = n & 1;
        n>>=1;
        // 加法运算优先于位运算
        res = (res<<1) + num;
    }
    return res;
};

 

方法二:

分治

先1个1个的交换位置,相当于奇偶位置交换

然后2个2个的交换位置

然后4个4个的交换位置

然后8个8个的交换位置

最后16个的16个的交换位置,此时实现彻底交换

/**
 * @param {number} n - a positive integer
 * @return {number} - a positive integer
 */
var reverseBits = function(n) {
    const M1 = 0x55555555; // 01010101010101010101010101010101
    const M2 = 0x33333333; // 00110011001100110011001100110011
    const M4 = 0x0f0f0f0f; // 00001111000011110000111100001111
    const M8 = 0x00ff00ff; // 00000000111111110000000011111111
    // <<< 运算优先 |
    // n >>> 1 & M1 取出前一位
    // (n & M1) 取出后一位
    // (n & M1) << 1 后一位左移1
    // 左移1的后一位 和 前一位或操作即完成未知的交换
    // 其他的同理
    n = n >>> 1 & M1 | (n & M1) << 1;
    n = n >>> 2 & M2 | (n & M2) << 2;
    n = n >>> 4 & M4 | (n & M4) << 4;
    n = n >>> 8 & M8 | (n & M8) << 8;
    return (n >>> 16 | n << 16) >>> 0;
};

 

 

 

-----smile

posted @ 2021-03-29 17:52  Walker-lyl  阅读(76)  评论(0编辑  收藏  举报