开始刷eetCode ,
LeetCode(190) Reverse Bits
题目如下:
Reverse bits of a given 32 bits unsigned integer.
For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as 00111001011110000010100101000000).
Follow up:
If this function is called many times, how would you optimize it?
分析
本题中,一开始我按照手工计算二进制的思路,使用了数组进行存储,最后按顺序读取数组。 使用这个方法时,遇到了整型溢出(这么说有些不合理,稍后解释)。最后网上找了方法,是用按位移的方式实现的。
int类型是32位存储,第一位作为符号位的话,最大值只能为2^32 -1 ,二进制表示为 31个1 。 在本题中,如果输入为1,理应返回 1 000…00(31个),然鹅我的做法达不到这个值,编译器自动-1 。
为什么会这样呢? 网上也没有合理的解释,只能暂定为 << 左移操作会把int强行变成无符号int。(java中没有无符号int类型)
public long reverseBitsFalse(int n) {// int 作为有符号整型,第一位用于表示符号,因此int的最大值 2^31 -1// 错误的方法int[] tmp = new int[32];int id = 0;while (n>0){tmp[id++] = n % 2;n /= 2;}long res = 0;int bb = 31;for(int i=0;i<id;i++){if(tmp[i] == 1)res += Math.pow(2,bb);bb--;}return res;}public int reverseBits(int n) {int result = 0;int i = 0;while (i < 32) {int temp = n & 0x01;n = n >> 1;result = (result << 1) | temp;i++;}return result;}