Loading

【每日一题】LeetCode 190. 颠倒二进制位

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


利用字符串格式化求原数的二进制表示,利用切片将其颠倒,利用 int(x, base=2) 转回整型。

class Solution:
    def reverseBits(self, n: int) -> int:
        return int(f"{n:032b}"[::-1], 2)

利用分治思想:颠倒 32 位二进制表示,可以先把低 16 位与高 16 位交换位置;颠倒 16 位二进制表示,可以先把低 8 位与高 8 位交换位置;……;颠倒 2 位二进制表示,只需把低 1 位和高 1 位交换位置。

倒过来考虑:每 2 位交换一次低位和高位;每 4 位交换一次低位和高位;……;每 16 位交换一次低位和高位。

利用位运算实现,时间复杂度 \(O(\log W)\),空间复杂度 \(O(\log W)\)\(W = 32\)

class Solution {
    const unsigned m[4] = {0x55555555, 0x33333333, 0x0f0f0f0f, 0x00ff00ff};
public:
    unsigned reverseBits(unsigned x) {
        x = (x >> 1 & m[0]) ^ (x & m[0]) << 1;
        x = (x >> 2 & m[1]) ^ (x & m[1]) << 2;
        x = (x >> 4 & m[2]) ^ (x & m[2]) << 4;
        x = (x >> 8 & m[3]) ^ (x & m[3]) << 8;
        return (x >> 16) ^ (x << 16);
    }
};
posted @ 2026-02-16 17:51  escap1st  阅读(6)  评论(0)    收藏  举报