LeetCode-java 190.颠倒二进制位(简单)

题190:类型:位运算

  • 题目:颠倒给定的 32 位无符号整数的二进制位。
    示例 1:
    输入: 00000010100101000001111010011100
    输出: 00111001011110000010100101000000
    解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
    因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
    示例 2:
    输入:11111111111111111111111111111101
    输出:10111111111111111111111111111111
    解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
    因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。
    提示:
    请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
    在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。
  • 位运算法
    1. 整体思想与,第7题整数反转的取模法,相同,只不过此次是对二进制数进行操作;
    2. 将整数对2取余后拿到对应二进制的最低位,然后将整数除以2,再对2取余可以拿到次低位,依次类推;
    3. 将上次累加结果 * 2 + 新余数,即可得到颠倒后的二进制位;

注意:(%2)与(&1)作用相同,可简单理解如下图。


public class Solution {
    // you need treat n as an unsigned value
    public int reverseBits(int n) {
        int result = 0;//结果
        // 对2取模,取出二进制最低位
        // 32位无符号整数,循环32次,不断获得二进制的高位,直至最高位
        for(int i = 0;i < 32;i++){
            result = (result << 1) + (n & 1); //等价于,(result *2)+(n % 2)
            n >>= 1; // n/2
        }
        return result;
    } 
}

小知识:有一篇讲解很好的位运算文章,请看《你说你会位运算,那你用位运算来解下八皇后问题吧》

你可能感兴趣的:(LeetCode-java 190.颠倒二进制位(简单))