第19回
いろいろな演算子~ビット演算子

Cは高級アセンブラ?

C言語は「高級アセンブラ」と言われることがあります。アセンブラとは、2進数の機械語命令と1対1で対応するアセンブリ言語のソースを読み込んで、実行形式ファイルを生成するプログラムです。文法は単純ですが、単純であるがゆえに難しい言語です。

高級言語と低級言語

アセンブリ言語には、変数やデータ型の概念もifやforなどの制御構造もありません。人間の感覚から最も遠い(=CPUに一番近い)言語です。プログラミング言語は、人間の感覚に近付くほど「高級」と呼ばれます。CやBASIC、FORTRANなど人間の理解できる言葉や式でソースを記述できる言語は高級で、アセンブリ言語は逆に低級となります ※1

プログラミング言語だけではなく、コンピュータのあらゆる機能は人間の感覚に近付くほど、機械の内部を覆い隠します。Windowsに代表されるGUIがその典型です。高級言語では変数やifやforを使えるため、通常はビット単位の演算を行えなくても十分用が足ります。

C言語にも、豊富な演算子や制御構造を記述する命令が備わっています。しかしまた、アセンブリ言語のように低レベルな処理を記述することもできます。その部分を指して「高級アセンブラ」と呼ばれる訳です。

プログラミング言語の仕様やプログラマーの能力に対して「高級/低級」としているのではありません。CPUに近い部分を「低い」、人間に近い部分を「高い」と表現しているだけです。低級言語を扱う方が遙かに高度な知識と技術を要します

ビット単位の演算子

C言語には、ビット演算子という演算子があります。文字通り値をビット単位で扱う演算子です。CPUの理解できるデータはすべて2進数で、それはメモリを構成する最小単位であるビット(bit)の状態──ONかOFFか──を数値の「0と1」に置き換えたものです。

しかし、2進数は人間にとっては非常に分かりづらいものなので、通常は、例えばメモリの番地(アドレス)も8ビットを1組としたバイト(byte)単位で指定します。電子の世界で生きるCPUは「0か1か?」しか扱えませんが、人間とのやり取りの中で8ビット=1バイトという妥協を行っている訳です ※2

ですから、通常はプログラミング言語でビット単位の2進数を扱う必要はありません。事務処理向けのCOBOLや数式を扱うFORTRANなど実務向けの古典的な言語には、ビットを扱う機能は用意されていません。

しかしCには、値をビット単位で扱う演算子が備わっています。また、CをベースにしたC++やJava、Microsoft社のC#、Visual Basic .NETなどにもビット演算の機能が受け継がれています。

もちろん、CPUが自主的に妥協しているわけではありません。人間の側が2進数と10進数との妥協点として、2の累乗である8進数や16進数を使うことに決めただけです