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?
1.做32次循环,处理一下就好了。
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t m=0;
int i=32;
while(i--){
if(n%2==1){
m=m*2+1;
}else{
m=m*2;
}
n/=2;
}
return m;
}
};
2.使用位运算value左移1,与n右移出的一位做或运算((n>>i)&1得到的是左边第1位的值)
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t value=0;
for(int i=0;i<32;i++){
value=(value<<1)|((n>>i)&1);
}
return value;
}
};
3.通过移位,来改变值;移位两边是对称的比如5和A对应为0101 、1010,左移和右移不会有1失去,前半保留了奇数位值再左移,后半保留了偶数位值再右移,取二者的或,得到值,这样象临的偶位、奇位互换;在进行一对奇偶兑换,4位个就兑换,8位,16位,这样就将整个数进行了一次兑换。交换他们的顺序依然是可以的!
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;
}
};