题目要求:要求将一个32位无符号整数所对应的二进制位反转得到的无符号整数。
解题思路:一般这种对应于二进制位的题目要考虑位运算!!而我可能对于位运算不太熟悉,每次都是用最愚蠢的办法做,虽然AC了,但是看了别人的解决方法才觉得自己好蠢,一开始我的想法就是将32位无符号整数化为二进制,存到一个含有32个元素的数组里,然后再反着计算。真是太傻了!!!!代码1,我就不多说了,随便看看应该就能看懂。
考虑位运算的方法是看了别人的解题思路写出来的,基本思想就是首先令fool=0,取得n的最后一位与fool相或,这个时候fool里面存的即使n的最后一位,然后将fool左移一位,这时n的最后一位变成了fool的第一位,并且fool的最后一位为0。将n右移一位,这时原来n的倒数第二位就成了现在的倒数第一位,取出这一位,然后与fool相与,这时fool的最后一位存的是n中的倒数第二位……,循环下去直到n的第一位被存到fool的最后一位中。当然这种方法的for循环中有很多种实现方法,可以每次右移n,也可以设置一个mask,每次左移mask。mask的作用是取得n的相应位,然后再右移。然后再与fool相与。
最后一种方法,真的是太神奇了!没有用到循环,具体思路见代码3注释。
代码实现:
1.
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
int a[32];
int i=0;
uint32_t result=n;
uint32_t s=0;
while(result!=0){
s=result%2;
result/=2;
a[i]=s;
i++;
}
for(int j=i;j<32;j++)
a[j]=0;
uint32_t sum=0;
for(int k=0;k<32;k++){
sum+=a[k]*pow(2,(31-k));
}
return sum;
}
};
2.1class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t fool=0;
for(int i=0;i<32;i++){
fool=(fool<<1)|(n&0x01);
n=n>>1; //for中的两句也可以合成一句 fool=(fool<<1)|((n>>i)&0x01);
}
return fool;
}
};
2.2
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t fool=0;
uint32_t mask=1;
for(int i=0;i<32;i++){
fool=(fool<<1)|((n&mask)>>i);
mask=mask<<1; //当然for中的两句同样也可以合成一句 fool=(fool<<1)|((n&(mask<<i))>>i)
}
return fool;
}
};
3.class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t x=n;
x=((x&0x55555555)<<1)|((x&0xAAAAAAAA)>>1);//交换相邻两个值
x=((x&0x33333333)<<2)|((x&0xCCCCCCCC)>>2);//两两一对,交换相邻两对
x=((x&0x0F0F0F0F)<<4)|((x&0xF0F0F0F0)>>4);//四个数一对,交换相邻两对
x=((x&0x00FF00FF)<<8)|((x&0xFF00FF00)>>8);//八个数一对,交换相邻两对
x=((x&0x0000FFFF)<<16)|((x&0xFFFF0000)>>16);//十六个数一对,交换相邻两对
return x;
}
};