下のビットから取り出して上へ積み、32 ビットを逆順にする

0 以上の整数を 32 ビットの並びとして見て、ビットの並びを左右逆にした数を返します。下のビットを 1 つずつ取り出し、答えを左へずらしながら積んでいく練習です。

海外で定番の問題リスト 4 本には入っていません

問題

通信の機器が、ビットの並びを逆の順で送ってきます。受け取った整数 n を、上に 0 を補った 32 ビットの並びとして見て、並びを左右逆にした数を返す関数を書いてください。いちばん下のビットがいちばん上へ、いちばん上のビットがいちばん下へ移ります。

  • n は 0 以上 4294967295 (2 の 32 乗から 1 を引いた数) 以下です
  • 答えも 0 以上 4294967295 以下の符号なしの整数で返します。いちばん上のビットが 1 でも、負の数にはしません

入力と出力の例

例 1

1 はいちばん下のビットだけが 1 です。逆にすると、いちばん上のビットだけが 1 の数、2 の 31 乗になります。

n = 1
2147483648

例 2

6 は下から 2 番目と 3 番目のビットが 1 です。逆にすると、上から 2 番目と 3 番目、つまり 2 の 30 乗と 2 の 29 乗の和です。

n = 6
1610612736

例 3

4096 は 2 の 12 乗です。下から 13 番目のビットは、逆にすると下から 20 番目、2 の 19 乗になります。

n = 4096
524288

面接での聞かれ方

面接では、ビットの取り出しと組み立てを確かめる問題として出されます。

  • 「32 ビットの符号なし整数のビットを逆順にしてください」
  • 「この関数を何度も呼ぶなら、速くできますか?」と続くことがあります
  • JavaScript で書くと、「いちばん上のビットが 1 のとき、負になりませんか?」と聞かれます

ずらす向きと回数、そして言語ごとの整数の扱いを正しく言えるかが見られています。

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

アルゴリズムのチートシートの「配列と文字列」に、この型の要点を表とコードでまとめています。

配列と文字列の問題は、全部の組を調べると手間が大きくなる所を、窓や左右の添字で減らす形が多いです。

main.py
def reverse_bits(n: int) -> int:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(reverse_bits(1))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します