190. Reverse Bits

練習日期:2026-02-16

難度:Easy

類型:Divide and Conquer、Bit Manipulation

📘 題目敘述

給定一個 32 位元有號整數,請將它的位元反轉。

條件限制

  • 0 <= n <= 2^31 - 2
  • n 是偶數

🧠 解題思路

我這份寫法是在做「逐位取出 + 逐位建立」。

我每次都從 n 的最低位開始取(用 n % 2),然後把它接到 ans 的尾端。

因為我要做的是反轉,所以「原本最低位」會變成「答案的最高位」,因此我每一輪都先把 ans 乘以 2(等價於左移一位),再把取出的 bit 加上去。

整個過程固定做 32 次,就能把 32 個位元完整反轉完。

所有變數

  • ans:正在建立的反轉結果(每輪把新 bit 接到 ans 右邊)

🪜 主要流程步驟

1. 初始化 ans = 0

ans 一開始是空的結果,所以設成 0。


2. 重複 32 次:每次把 n 的最低位搬到 ans 的右邊

每一輪都做同一件事:

先用 n % 2 取得 n 的最低位。
再用 ans = 2 * ans + n % 2ans 左移一格並把這個 bit 放進去。

這樣連做 32 次,就等於把 n 的 bit 從低到高取出,依序塞到 ans,最後就變成反轉。


3. 每輪都把 n 右移一位

我用 n = (n - n % 2) / 2 把最低位移除,讓下一輪可以取到下一個 bit。


4. 回傳 ans

32 次做完後,ans 就是反轉後的整數。

⏱️ 複雜度

  • 時間複雜度:O(32),也就是 O(1)
  • 空間複雜度:O(1)

💻 程式碼實作

class Solution {
public:
    int reverseBits(int n) {
        int ans = 0;
        for (int i = 0; i < 32; i++) {
            ans = 2 * ans + n % 2;
            n = (n - n % 2) / 2;
        }
        return ans;
    }
};

https://leetcode.com/problems/reverse-bits/

作者: scottnick
撰寫日期: 2026-02-16
類別:
原文連結: https://scottnick.github.io/cpp-notes/all%20problems/190-reverse-bits.html