• 190. Reverse Bits


    一、题目

      1、审题

      

      2、分析

        给出一个 32位的无符号整形,将其二进制形式进行翻转,求出反转后的二进制代表的数值。

    二、解答

      1、思路:

        方法一、

          采用位运算符进行运算。

          ①、n & 1 可以取到 n 的最后一位二进制位 end;

          ②、n >>>= 1,n 无符号右移一位

          ③、result <<= 1, result |= end; result 左移一位,且将 end 添加在 result 尾部。

        public int reverseBits(int n) {
            int result = 0;
            for(int i = 0; i < 32; i++) {
                int end = n & 1; // 计算 n 的最后一位
                n >>>= 1;        // n 无符号右移一位
                result <<= 1;    // result 左移一位
                result |= end;   // result 添加 n 的末尾一位
            }
            return result;
        }

      优化:

         当此方法需要被多次调用时,可以将 n 分成 4 份 8 bit ;

       且将用到的 8bit 二进制的翻转存入到一个 Map 作为 cache。

        public int reverseBits(int n) {
            byte[] bytes = new byte[4];
            for (int i = 0; i < 4; i++) 
                bytes[i] = (byte)((n >>> 8*i) & 0xFF);
            
            int result = 0;
            for(int i = 0; i < 4; i++) {
                result <<= 8;
                result += reverseByte(bytes[i]);
            }
            return result;
        }
        
        private int reverseByte(byte b) {
            Integer value = cache.get(b);
            if(value != null)
                return value;
            
            value = 0;
            for(int i = 0 ; i < 8; i++) {
                value <<= 1;
                value += ((b >>> i) & 1);
            }
            cache.put(b, value);
            return value;
        }
  • 相关阅读:
    bash /root/.bashrc permission denied
    vscode 在ubuntu的terminal中下划线不显示解决方案
    基于SSH框架的考勤管理系统的设计与实现
    关于《实验一》的框架选择
    认知架构
    《软件需求》读书笔记3
    《软件需求》读书笔记1
    《软件需求》读书笔记2
    《软件方法》读书笔记2
    《软件方法》读书笔记3
  • 原文地址:https://www.cnblogs.com/skillking/p/9806654.html
Copyright © 2020-2023  润新知