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;
    }

 

posted @ 2018-10-17 19:54  skillking2  阅读(141)  评论(0编辑  收藏  举报