题目
如题所示,颠倒数字的二进制位。。
比如1001=>1001哦好像还是不变哦。。
再比如1100=>0011就是将位反转。
解题与思考(含图片解析):
我们应该做过将数组的数据反转。。
我们是利用双指针来进行。
那这个数字的二进制位我们也能这样吗?很明显不行的。。但是可以类似于链表的反转,将它一位一位的取下来再拼上去。
图解
我们需要解决两个个问题:
- 如何从二进制数中取下最右边的数?利用和1相与如n&1
- 如何拼接呢?利用与0相或再左移可以不断的拼接
代码实现:
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
unsigned int res = 0;
unsigned int t = 0;
//循环执行32次即可,每次取出一个位放入res
for(int i=0;i<32;i++){
//计算结果之前把res左移一位腾出位置接受新的位
res<<=1;
//利用和1相与取出最右位(其余位维持为0)
t = n&1;
//将取出的最右位存入res的最右边。
res |= t;
//由于n的最右位被取了,更新n到下一个最右位。
n>>=1;
}
return res;
}
};