190. 颠倒二进制位

107 阅读1分钟

190. 颠倒二进制位 - 力扣(LeetCode)

大数逆转

即把这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;

    }
};

image.png




评论区题解 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;
    }
};

image.png <<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