Reverse bits of a given 32 bits unsigned integer.
For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as00111001011110000010100101000000).
Follow up:
If this function is called many times, how would you optimize it?
Related problem: Reverse Integer
分析:每次n都是依次做除以2的操作,result左移相当于乘以2的操作(当前最后一位补0),遇到n的最后一位是1的情况,则answer目前的值最后一位从0变成1.整个循环的次数是机器内无符号数的长度。
public int reverseBits(int n) {
int answer = 0;
int i;
/*把一个unsigned int 数字1一直左移,直到它变成全0的时候,也就得到了该机器内unsigned int的长度*/
for (i = 1; i != 0; i <<= 1){//每次循环结束,保证answer最后一位刚好是n要舍去的那一位
answer <<= 1;/*answer左移一位,相当于乘以2的操作*/
// System.out.println("answer = "+answer);
if ((n&1)==1) { /*n的最后一位是1*/
answer ^= 1; /*把answer当前的最后以为也变成1*/
}
n >>= 1;/*n向右移,每次相当于除以2的操作*/
}
return answer;
}
public int reverseBits2(int n) {
int answer = 0;
int i;
/*把一个unsigned int 数字1一直左移,直到它变成全0的时候,也就得到了该机器内unsigned int的长度*/
for (i = 1; i != 0; i <<= 1){//每次循环结束,保证answer最后一位刚好是n要舍去的那一位
answer <<= 1;/*answer左移一位,相当于乘以2的操作,所以目前最后一位肯定是0*/
// System.out.println("answer = "+answer);
if ((n&1)==1) { /*n的最后一位是1*/
answer =answer + 1; /*把answer当前的最后以为也变成1*/
}
n >>= 1;/*n向右移,每次相当于除以2的操作*/
}
return answer;
}