C++で32ビット整数のビットを反転する方法【サンプルコード付き】
はじめに
プログラミングにおいて、符号なし整数(unsigned int)のビット列を反転させる処理は、ビット演算の基礎を学ぶうえで非常に良い題材です。本記事では、32ビット符号なし整数のビットをすべて逆順に並べ替えるアルゴリズムを、C++のコード例とともにわかりやすく解説します。
たとえば、次のような32ビットの2進数表現を持つ数値 x を考えてみましょう。
00000000000000000000001001110100
このビット列を反転(リバース)すると、結果は以下のようになります。
00101110010000000000000000000000
タスクは、この反転後のビット列が表す実際の数値を返すことです。
解決手順
この問題は、以下の手順で解くことができます。
- 与えられた数値を n とします。
- 結果を格納する変数 answer を 0 で初期化します。
- i を 31 から 0 まで1ずつ減らしながらループします。
- n の最下位ビット(LSB)を取り出し、i ビット左にシフトして answer に OR 演算で加えます。
- n を1ビット右にシフトして、次のビットへ移ります。
- ループ終了後、answer を返します。
この方法では、元の数値の最下位ビットから順に読み取り、それを結果の上位側から詰めていくことで、効率的にビット反転を実現しています。
C++での実装例
それでは、実際のC++コードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t ans = 0;
for(int i = 31; i >= 0; i--){
ans |= (n & 1) << i;
n >>= 1;
}
return ans;
}
};
main(){
Solution ob;
cout << ob.reverseBits(0b00000000000000000000001001110100);
}コードのポイント
- (n & 1):n の最下位ビットだけを取り出すマスク操作です。
- << i:取り出したビットを目的の位置まで左シフトします。
- |=:OR 演算によって、answer の対応する位置にビットをセットします。
- n >>= 1:n を右シフトし、次に処理するビットを最下位に移動させます。
入力と出力
入力
0b00000000000000000000001001110100
出力
775946240
まとめ
ビット反転は、ループとシフト演算・論理演算を組み合わせることで、シンプルかつ効率的に実装できます。今回紹介した手法は計算量 O(1)(固定32回のループ)であり、面接や競技プログラミングでも頻出のテクニックです。ぜひ自分のコードにも応用してみてください。
-
C++ STLのlist::reverse()関数の使い方と実例解説
本記事では、C++におけるlist::reverse()関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるlistとはlistは、シーケンス内の任意の位置で定数時間O(1)での要素の挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、メモリの非連続的な割り当てが可能です。配列、vector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。listはforward_listと似ていますが、forwar
-
正の整数のビットを反転するPythonプログラムの書き方
Pythonで正の整数のビット順を逆にするには、まず bin() 関数を使って数値を2進数に変換します。bin() は変換結果の先頭に「0b」というプレフィックスを付加するため、その最初の2文字を除外し、残りの部分を反転させます。さらに、指定されたビットサイズに合わせて、反転した文字列の末尾に0を補完します。最後に、反転した2進数の文字列を整数へと変換し直すことで、ビットが反転された値が得られます。 アルゴリズム integernumber(n, bit_size) /* n は対象の数値、bit_size はビットサイズ */ ステップ1: まず bin() 関数で数値を2進数に変換する。