前些天在网上做题,看到了这么一道题:给定一个无符号32位整数,要求将其2进制形式数反转(即首尾颠倒,非按位取反),输出反转后的整数。(即如果给定的数为:43261596,它的二进制数为:00000010100101000001111010011100,将二进制数反转得到:00111001011110000010100101000000,所以期望的输出结果应该为:964176192)


当时自己的第一反应居然是:
1、先用Integer.toBinaryString(num),将整数转成二进制字符串。

2、把生成的二进制字符串放到list里面,然后进行反转。

3、用list.toString()把反转结果转成String字符串。

4、再用Integer.parseInt(str,2)把二进制字符串转回整数。


简直蠢哭_(:з」∠)_


后来在同事的提醒下才想到一个平时几乎很少用的东东:位运算。

用到位运算接下

去就简单多了


public int reverseBits(int n) { 

   int y = 0;                                 //0000 0000 0000 0000 0000 0000

   int digit = 0;

    for(int i = 0 ; i < 32; i++){

         y = y << 1;                     //将y左移

         y = y | n & 1;                 //将n与1做与运算,目的是为了将n的最后一位复制下来,再去跟y做或运算,即把复制下来的值放到y上面

         x = n >> 1;                  //将n右移

    } 

   return y;

 }


第一次循环拿到n的最后一位,把它复制到y的最后一位上面。然后y左移,n右移。

第二次循环拿到n的倒数第二位,把它复制到y的最后一位上面。然后y左移,n右移。

循环结束后,二进制数得到反转。