[情報処理基礎学習]②負数表現とシフト演算

言うほど使う頻度は高くないのですぐ忘れる

負数表現

コンピュータでの数値表現にて、負数の表し方(固定小数点表示の場合)

負数は2の補数で表現する。

e.g.「8ビットの場合」
“00010100” (10進数で20)
↓2の補数で変換
“11101100” (10進数で-20)

※補数について
補数は桁が1つ上がる数のこと。
10進数の324の補数は676(足すと1,000)。
2進数の101の補数は011(足すと1000)。

減算を加算に変換するために用いられる。
コンピュータでは減算器より加算器の方が効率がいいらしい。

e.g.「減算を加算に変換(10進数の場合)」
52,934 – 38,917
= 52,934 – (100,000 – 61,083) ※10進数の10の補数に変換
= 52,934 + 61,083 – 100,000
= 114,017 – 100,000
= 14,017
※コンピュータだと「-100,000」は桁を落とせば済む。

また、補数を-1した数も補数として使用される。
桁が繰り上がる補数を”基数の補数”、-1した補数を”減基数の補数”という。
なお、10進数の場合は”基数の補数”を”10の補数”、”減基数の補数”を”9の補数”という。
また、2進数の場合は”基数の補数”を”2の補数”、”減基数の補数”を”1の補数”という。

e.g.「10進数27(2進数 11011)の補数」
10の補数は「73」
9の補数は「72」
2の補数は「00101」
1の補数は「00100」
※1の補数は元の値のビット反転になっている。

シフト演算

シフト演算はビットを移動させる処理で、”算術シフト”と”論理シフト”がある。

(1) 算術シフト

ビット列を数値として扱う移動方法。
最上位桁は符号ビットとしてビット移動の対象外となる。
2進数値の桁の上げ下げと同じなので、左シフトは2倍、右シフトは1/2を意味する。
(左nビットシフトは2n倍、右nビットシフトは2-n倍)
ビット移動で空いた桁には、左シフトなら’0’、右シフトなら符号ビットと同値が入る。

e.g.「”11111010″(10進数で-6)を算術シフト」

(2) 論理シフト

論理シフトはビット列の単純移動
ビット移動で空いた桁には、左シフトでも右シフトでも’0’が入る。

e.g.「”11111010″を論理シフト」