C++のビット演算子を完全解説!初心者でもわかる & | ^ ~ << >> の使い方
生徒
「C++の本を読んでいたら、見たことのない記号がたくさん出てきました。これは何をしているんですか?」
先生
「それはビット演算子といって、数字をとても細かい単位で操作するための演算子です」
生徒
「数字を細かく操作するって、どういう意味ですか?」
先生
「数字を二進数という形にして、一桁ずつ判断するイメージです。順番に説明しますね」
1. ビット演算子とは?
C++のビット演算子は、数値をそのまま計算するのではなく、 数値の中身を一つ一つのビット単位で扱うための演算子です。 ビットとは、コンピュータが扱う最小の情報の単位で、 ゼロかイチのどちらかの状態しか持ちません。 普段私たちが見ている数字も、 コンピュータの中ではビットの集まりとして保存されています。 ビット演算子を使うことで、 その内部構造を直接操作できるようになります。
2. ビット演算の前に知っておきたい二進数
ビット演算子を理解するためには、 二進数という考え方を知っておく必要があります。 二進数は、ゼロとイチだけで数を表す方法です。 例えば、十進数の五は、 二進数では一〇一と表されます。 これは、スイッチがオンかオフかで数を表していると考えると、 初心者でもイメージしやすくなります。
3. AND演算子「&」の仕組み
ビット演算子の「&」は、 二つの数値をビットごとに比べ、 両方がイチのときだけイチになります。 どちらか一方でもゼロなら、 結果はゼロになります。 共通している部分だけを取り出す、 という感覚で覚えると理解しやすいです。
int a = 6; // 二進数では 110
int b = 3; // 二進数では 011
int result = a & b;
std::cout << result << std::endl;
2
4. OR演算子「|」とXOR演算子「^」
「|」は、どちらか一方でもイチであれば、 結果がイチになります。 一方で「^」は、二つが違うときだけイチになります。 同じならゼロになるのが特徴です。 条件の違いを見つけたいときに、 XOR演算子は役立ちます。
int x = 5; // 101
int y = 3; // 011
std::cout << (x | y) << std::endl;
std::cout << (x ^ y) << std::endl;
7
6
5. NOT演算子「~」でビットを反転する
「~」は、すべてのビットを反対にします。 イチはゼロに、 ゼロはイチに変わります。 数字が大きく変わるため、 初心者は驚きやすい演算子です。 内部のビットが反転している、 という点を意識すると理解しやすくなります。
int num = 1;
int result = ~num;
std::cout << result << std::endl;
-2
6. ビットを動かすシフト演算子「<<」「>>」
シフト演算子は、 ビットを左右にずらす演算子です。 「<<」は左に移動し、 「>>」は右に移動します。 左にずらすと数は大きくなり、 右にずらすと数は小さくなります。 桁を移動させている、 という感覚で覚えると理解しやすいです。
int value = 2;
std::cout << (value << 1) << std::endl;
std::cout << (value >> 1) << std::endl;
4
1
7. ビット演算子が使われる場面
ビット演算子は、 設定の管理や状態の判定など、 複数の情報を一つの数値で扱う場面で使われます。 見た目は難しく感じますが、 仕組み自体はとても単純です。 ビット単位で考えることで、 コンピュータがどのように情報を扱っているかを、 実感できるようになります。
8. 初心者がつまずきやすいポイント
ビット演算子は、 普段の計算と考え方が違うため、 最初は混乱しやすい分野です。 まずは二進数のイメージと、 各演算子の役割を理解することが大切です。 数字ではなく、 ビットの並びを操作している、 という意識を持つと、 少しずつ理解が深まっていきます。