【ITニュース解説】Day 2 of C++ Programming: Bitwise Operators (AND, Shift, NOT)
2025年09月21日に「Dev.to」が公開したITニュース「Day 2 of C++ Programming: Bitwise Operators (AND, Shift, NOT)」について初心者にもわかりやすく解説しています。
ITニュース概要
C++のビット演算子(AND, Shift, NOT)は、コンピュータが理解するバイナリビットを直接操作する強力な機能だ。最初は難解だが、例を通じてANDによるビット抽出、Shiftによる乗算、NOTによるビット反転の動きを学べば、その重要性がわかるだろう。
ITニュース解説
システム開発の世界へようこそ。プログラミングの学習を進める上で、特にC++のような言語では、コンピュータが情報をどのように扱っているかを理解することが重要になります。今回は、コンピュータの最も基本的な情報の単位である「ビット」を直接操作する「ビット演算子」について解説します。これらは一見すると抽象的で難しそうに見えるかもしれませんが、コンピュータの内部動作を理解し、効率的なプログラムを書く上で非常に強力なツールとなります。
コンピュータは、すべての情報を0と1の二進数、つまり「ビット」の並びとして処理する。私たちが普段使う数字や文字、画像なども、最終的にはすべてビットの組み合わせとして表現されている。ビット演算子は、まさにこのビット一つ一つに対して直接的な操作を行うための特別な機能だ。
ビットAND演算子(&)
最初に紹介するのは、ビットAND演算子「&」だ。この演算子は、二つの数値をビットレベルで比較し、対応する位置のビットが両方とも「1」である場合にのみ結果のビットを「1」にする。それ以外の場合は「0」となる。この性質から、特定のビットを「取り出す」または「フィルタリングする」用途によく使われる。これを「マスキング操作」と呼ぶ。
具体例で見てみよう。たとえば、数値の11と7をビットAND演算子で結合するケースを考える。 まず、11を二進数で表現すると「1011」となる。 次に、7を二進数で表現すると「0111」となる。 この二つの二進数を、桁ごとにAND演算する。
1011 (11) & 0111 (7)
0011 (3)
一番右の桁から見ていくと、
- 1番右の桁: 1と1なので、結果は1。
- 右から2番目の桁: 1と1なので、結果は1。
- 右から3番目の桁: 0と1なので、結果は0。
- 右から4番目の桁: 1と0なので、結果は0。
したがって、結果の二進数は「0011」となり、これを十進数に変換すると「3」になる。このようにビットAND演算子は、特定のビットパターンを識別したり、不要なビットを0に設定したりする際に非常に役立つ演算子だ。
ビットシフト演算子(<<)
次に、ビットシフト演算子「<<」について説明する。これは、数値の二進数表現を左または右にずらす演算子だ。ここでは、左にずらす「左シフト」に焦点を当てる。左シフトは、数値のビットパターンを左方向へ移動させ、空いた右側のビットには「0」が埋められる。
これも例で見てみよう。数値の5を1ビットだけ左にシフトするケースを考える。 5を二進数で表現すると「0101」となる。 これを1ビット左にシフトすると、すべてのビットが左へ一つ移動し、一番右には0が追加される。
0101 (5) << 1
1010 (10)
結果の二進数は「1010」となり、これを十進数に変換すると「10」になる。元の数値が5で、結果が10であることからわかるように、左に1ビットシフトすることは、元の数値を2倍することと同じ効果がある。これは、十進数で数字を左にずらすと10倍になるのと同じ原理で、二進数では2倍になる。より高速な掛け算や、特定のビット位置でのデータ操作に利用される。
ビットNOT演算子(~)
最後に、ビットNOT演算子「~」について解説する。この演算子は、対象の数値のすべてのビットを反転させる。「0」であれば「1」に、「1」であれば「0」に変換する。これは非常に単純な操作だが、その結果は予期せぬものに見えるかもしれない。
例として、数値の5にビットNOT演算子を適用してみよう。 5を二進数で表現すると、例えば8ビットで考える場合は「00000101」となる。 このすべてのビットを反転させるとどうなるだろうか。
00000101 (5) ~
11111010
結果の二進数は「11111010」となる。これを十進数に変換すると、単純に2進数から10進数への変換ルールだけでは理解しにくい結果になることがある。C++のような言語では、整数は通常「符号付き整数」として扱われ、その表現方法として「2の補数」という方式が一般的に用いられている。この2の補数表現では、最も左のビットが「1」である場合、その数値は負の数を示す。したがって、「11111010」は、十進数で「-6」という値になる。
なぜ「-6」になるのか、2の補数について詳しく説明することはここでは避けるが、ビットNOT演算子はすべてのビットを反転させるため、正の数に適用すると負の数になることが多いということを覚えておくと良いだろう。これは、データの状態を完全に反転させたり、特定のビットフィールドを操作したりする際に使われる。
これらのビット演算子は、プログラミングにおいてデータの低レベルな操作を行う上で不可欠なツールだ。システムプログラミング、組み込みシステム、ネットワークプログラミング、暗号化など、パフォーマンスが重要視される多くの分野で利用されている。最初は難しく感じるかもしれないが、コンピュータが情報をどのように処理しているかという根本原理に触れることで、プログラミングスキルを大きく向上させることができるだろう。ビット演算子の理解は、より深いシステム理解への第一歩となる。