プログラムが動作する仕組みを頭の中でイメージできるようになるためには、コンピュータの内部でデータがどのような形式で表され、どのような方法で演算されているのかを知ることが重要。2進数でデータを演算する仕組みをマスターできれば、プログラムが動作する仕組みも見えてくるはず。
コンピュータが情報を2進数で取り扱う理由
コンピュータの内部がIC(集積回路)と呼ばれる電子部品で構成されており、ICの特性により、コンピュータでは必然的に情報を2進数で取り扱う必要が出てくる。
ビット: コンピュータを取り扱う情報の最小単位。2進数の1桁に該当。
バイト: コンピュータを取り扱う情報の基本単位。8桁の2進数。
メモリやハードディスクなどにはバイト単位でデータが格納され、バイト単位でデータが読み書きされる。
2進数とは
「00100111」という2進数の値を10進数の値に変換してみる。
この時になぜこのような変換方法になるのか、説明できることが重要。
重み: 10進数で表された39という数値の各桁の数値にかけている10や1などの値のこと桁が違えば重みも違うし、桁が上がればだんだん重くなる。
そもそも数値は、その数値を構成する核桁の数値に重みをかけた値を合計した結果を表している。
例えば39という10進数なら30+9を表しており、核桁の数値に重みを掛けて合計した値を表していることになる。
この考え方は2進数でも同じ。
「2の補数」はコンピュータ処理に都合がいい
コンピュータは、引き算を行う場合に、内部的には足し算として演算するようになっている。そのため、マイナスの値を表すときに2の補数を使用するという工夫がなされている。
2の補数: 2進数において、プラスの値でマイナスの値を表すという不思議な数。2の補数を得るためには、2進数で表された各桁の数値を全て反転し、その結果に1を加える。
例えば、-1を8桁の2進数で表すなら、1すなわち「00000001」の2の補数を求める。「00000001」の2の補数は、各桁を全て反転して1を加えるので「11111111」となる。
もう一つ例。3-5を考える。5=00000101の2の補数は反転して+1で「11111011」なので、「00000011 + 11111011」 = 11111110となり最上位桁が1となっているのでマイナスの値を表している。ここでもう一度2の補数を求める。全ビット反転して1を加えて、00000010となり、-2が導き出される。
論理右シフトと算術右シフトの違い
論理右シフト: 2進数の値が数値ではなく、グラフィックのパターンなどの場合には、シフト後の上位桁に「0」を入れること。
算術右シフト: 2進数の値を符号がある数値として演算する場合には、シフト前の符号ビットの値(0または1)を入れること。
2の補数で表されたマイナスの値の場合には、右シフトして空いた上位桁に「1」を入れることで、符号つきで正しく、1/2倍、1/4倍、1/8倍などの数値演算が実現できる。