颠倒给定的 32 位无符号整数的二进制位。

 

提示:

  • 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
  • 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825

 

进阶:
如果多次调用这个函数,你将如何优化你的算法?

 

示例 1:

输入: 00000010100101000001111010011100
输出: 00111001011110000010100101000000
解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596     因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000

示例 2:

输入:11111111111111111111111111111101
输出:10111111111111111111111111111111
解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
     因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。

示例 1:

输入:n = 00000010100101000001111010011100
输出:964176192 (00111001011110000010100101000000)
解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596 因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000

示例 2:

输入:n = 11111111111111111111111111111101
输出:3221225471 (10111111111111111111111111111111)
解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
     因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。

 

提示:

  • 输入是一个长度为 32 的二进制字符串
Related Topics
  • 位运算
  • 分治
  • \n
  • 👍 420
  • 👎 0
  • 题解

    头皮发麻。需要重新复习下二进制运算的相关知识

    与&:0&0=0 0&1=0 1&0=0 1&1=1

    或|:0|0=0 0|1=1 1|0=1 1|1=1

    异或^:0^0=0 0^1=1 1^0=1 1^1=0

    取反~:~1=0 ~0=1

    左移<<:左边的二进制位丢弃,右边补0

    右移>>:正数左补0,负数左补1,右边丢弃

    无符号左移<<<:左边的二进制位丢弃,右边补0

    无符号右移>>>:忽略符号位,空位都以0补齐

    按照题意,我们需要把原本32位二进制数的第0位移动到第31位,第1位移动到第30位,第2位移动到第29位,依次处理

    public int reverseBits(int n) {
            int rev = 0;
            for (int i = 0; i < 32; i++) {
                //tmp = n 与上 1
                //实际操作为
                // 00000000000000000000001010101110
                // 与上
                // 00000000000000000000000000000001
                // 的操作
                //结果为 n的最末尾数, 因为与后面的数字  前面都为0,最末尾为1,
                //根据与运算的规则 结果为
                // 00000000000000000000000000000001
                // 或者
                // 00000000000000000000000000000000
                int tmp = n&1;
                //把上面的结果tmp左移到左边对应的(31-i)位置
                //结果为
                // 10000000000000000000000000000000
                // 或者
                // 00000000000000000000000000000000
                tmp = tmp << (31-i);
                //初始的rev为
                // 00000000000000000000000000000000
                // 和tmp进行或运算 ,就可以将原来的末位二进制数移动到rev顺序的对应位置
                rev = rev|tmp;
                // 再把n往右无符号右移一位,去除掉了刚刚运算过的末位数
                n = n>>>1;
            }
    
            return rev;
        }

    emm还有一个,可以看下java.lang.Integer#reverse的方法

    /**
         * Returns the value obtained by reversing the order of the bits in the
         * two's complement binary representation of the specified {@code int}
         * value.
         *
         * @param i the value to be reversed
         * @return the value obtained by reversing order of the bits in the
         *     specified {@code int} value.
         * @since 1.5
         */
        public static int reverse(int i) {
            // HD, Figure 7-1
            i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;
            i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333;
            i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;
            i = (i << 24) | ((i & 0xff00) << 8) |
                ((i >>> 8) & 0xff00) | (i >>> 24);
            return i;
        }