下の ビットから 取り出して 上へ 積み、 32 ビットを 逆順にする
0 以上の
海外で定番の問題リスト 4 本には入っていません
問題
通信のn を、
nは 0 以上 4294967295 (2 の 32 乗から 1 を引いた 数) 以下です - 答えも 0 以上 4294967295 以下の
符号なしの 整数で 返します。 いちばん上の ビットが 1 でも、 負の 数に はしません
入力と出力の例
例 1
1 は
例 2
6 は
例 3
4096 は 2 の 12 乗です。
面接での聞かれ方
面接では、
- 「32 ビットの
符号なし整数の ビットを 逆順に してください」 - 「この
関数を 何度も 呼ぶなら、 速く できますか?」と 続く ことがあります - JavaScript で
書くと、 「いちばん上の ビットが 1 の とき、 負に なりませんか?」と 聞かれます
ずらす
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
アルゴリズムのチートシートの「配列と文字列」に、
関わる学び
配列と
まず 考える手順
段 1
数を 2 進の
段 2
答え out を 0 からout を 1 ビット左へずらし、n のn & 1 を out にn を 1 ビット右へずらします。
段 3
n が>>> 0 で
解答
Python
Python
def reverse_bits(n):
out = 0
for _ in range(32):
out = (out << 1) | (n & 1)
n >>= 1
return outJavaScript
JavaScript
function reverseBits(n) {
let out = 0;
for (let k = 0; k < 32; k++) {
out = (out << 1) | (n & 1);
n >>>= 1;
}
return out >>> 0;
}Go
Go
func reverseBits(n uint32) uint32 {
var out uint32
for k := 0; k < 32; k++ {
out = out<<1 | n&1
n >>= 1
}
return out
}Python のuint32 で
計算量
- 時間は O(1) です。
いつも ちょうど 32 回まわります - 使う
記憶は O(1) です - 何度も
呼ぶなら、 8 ビットの 256 通りを 逆に した 表を 先に 作り、 4 つに 分けて 表を 引いて 組み直すと、 ループが 4 回で済みます
よく ある間違い
nが 0 になったら止める。 例 1 で 1 回目の あと nが 0 になり、 outが 1 のままです。上の 0 も 位を 作るので、 必ず 32 回まわします - JavaScript で
符号なしに 戻さない。 例 1 の 答えは、 out << 1の結果として -2147483648 に なります。 最後に >>> 0を付けます - JavaScript で
n >>= 1と書く。 符号つきでずらすので、nが 2147483648 以上だと上から 1 が 入り続けます。 >>>=を使います - ずらす
向きを 逆にする。 outを右へ、 nを左へずらすと、 並びは 逆に なりません。 答えは 左へ、 受け取った 数は 右へずらします
解答を動かした版 Python 3.14.7Node.js 24.22.1Go 1.24.2確認日 2026年11月8日
面接での 話し方の例
書き始める
「答えを 0 から
始め、 32 回、 答えを 左へ 1 ビットずらして nのいちばん下の ビットを 足し、 nを右へ 1 ビットずらします。 最初に 取り出した ビットが 31 回ずらされて上へ 行くので、 並びが 逆に なります。 nが早く 0 に なっても 32 回まわします。 時間も 記憶も O(1) です。」
書き終えたら、
「例 2 の 6 は 110 です。
1 回目は 下の ビット 0 を 取り出して outが 0、2 回目と 3 回目は 1 を 取り出して outが 1、11 です。 残りの 29 回は 0 を 足しながら左へずらすので、 11 の あとに 0 が 29 個並び、 2 の 30 乗と 2 の 29 乗の 和の 1610612736 です。」