大数逆转
即把这32位数装到一个string里面,再逆置一下,通过stoi将其转为10进制return;
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
//32位数太大了,放到string里面了。
//放到string
uint32_t t;
string s; string v;
for(int i=s.size()-1;i>=0;i++)
{
v.push_back(s[i]);
}
t=stoi(v);
return t;
}
};
评论区题解 190. 颠倒二进制位 - 力扣(LeetCode)
位运算
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = 0;
for (int i = 0; i < 32; ++i) {
res = (res << 1) | (n & 1);
n >>= 1;
}
return res;
}
};
<<1运算就是
高位舍弃,低位补0
res<<1运算就是每次可以保证最低位res为0
再与后面 | 进行结合。
这个|可以理解为无进位的加法:相当于在二进制数字后面加上结果
| 按位或(相当于无进位的加法),因为res每次左移一位了,所以res最低位为0,(0|0=0; 0|1=1) ,所以该式相当于res+(n最低位的值)
(n&1) 表示取n最低位的元素(0或1),相当于n%2
当i为0时:
| (n&1)==(11001001&00000001)=1 |
|---|
| (res<<1)=(0<<1)=0 |
| ---- |
| res=(res<<1)&(n&1)=1 |
| ---- |
| n>>1=1100100 |
|---|
当i为1时:
| (n&1)=1100100 &1=0 |
|---|
(res<<1)|(n&1)=00000010 | 00000000 = 00000010=10
| res<<1=00000001<<1=00000010 |
|---|
依次类推,只有当n&1=1时,res后面才会+1,否则都为0