190. 颠倒二进制位

发布时间 2023-11-12 19:46:28作者: Frommoon

题目

  • 颠倒给定的 32 位无符号整数的二进制位。

示例 1:

输入:n = 00000010100101000001111010011100
输出:964176192 (00111001011110000010100101000000)
解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。

示例 2:

输入:n = 11111111111111111111111111111101
输出:3221225471 (10111111111111111111111111111111)
解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。

法一、字符串

  • 思路:无符号整数的二进制位-->二进制字符串-->字符串翻转-->转换成整数
class Solution:
    def reverseBits(self, n: int) -> int:
        n=bin(n)[2:].zfill(32) #二进制转字符串,并补齐32位,不补齐反转后直接异位,得不到想要的结果
        n=n[::-1] #字符串翻转
        return int(n,2)  #二进制换整数,第二个参数2表示当前数字为二进制

法二、循环

  • 把n从右边一个一个取下来放到res的右边
  • 代码中和自己理解的左右刚好相反,没有理解
class Solution:
    def reverseBits(self, n):
        res = 0
        for i in range(32):
            res = (res << 1) | (n & 1)  #1&1结果为1;1&0的结果为0;|有1就为1
            n >>= 1 #n右移
        return res