zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    何时使用Entity或DTO
    Lombok简介
    Spring Boot实现STOMP协议的WebSocket
    Java泛型构造函数
    Java 8 Comparator: 列表排序
    Spring Boot + Elastic stack 记录日志
    Sping、SpringMVC、SpringBoot的对比
    FileChannel指南
    让Spring Boot启动更快
    架构级开闭原则
  • 原文地址:https://www.cnblogs.com/Walker-lyl/p/14593529.html
Copyright © 2011-2022 走看看