基数変換・2の補数・シフト・浮動小数点:数値表現を具体例で理解する
同じビット列なのに、正の数にも負の数にも見えるのはなぜでしょうか?
値はビット幅と表現方法で決まります。基数変換、2の補数、シフトを順に追い、最後に小数と浮動小数点の表し方を確認します。
基数変換の高速解法:2進数・10進数・16進数の相互変換
基数変換を解く最大のコツは、「16進数は2進数4ビットの塊である」という対応関係を反射的に引き出せるようにすることです。
10進数 | 2進数 (4bit) | 16進数 | 10進数 | 2進数 (4bit) | 16進数 |
|---|---|---|---|---|---|
0 | 0000 | 0 | 8 | 1000 | 8 |
1 | 0001 | 1 | 9 | 1001 | 9 |
2 | 0010 | 2 | 10 | 1010 | A |
3 | 0011 | 3 | 11 | 1011 | B |
4 | 0100 | 4 | 12 | 1100 | C |
5 | 0101 | 5 | 13 | 1101 | D |
6 | 0110 | 6 | 14 | 1110 | E |
7 | 0111 | 7 | 15 | 1111 | F |
実戦テクニック16進数 ⇄ 2進数は4桁ずつ区切るだけ
- 16進数 0x5B を2進数にする
5 は 0101、B(11) は 1011 → つなげて 01011011(瞬時に完了)
- 2進数 11011001 を16進数にする
下位から4桁区切り 1101 と 1001 → D と 9 → 0xD9
2の補数表現:コンピュータが引き算を足し算で解く仕組み
2の補数を使うと、引き算を負の数の加算として扱えます。加算回路を減算にも利用できることが利点です。CPUに減算用の回路が存在しない、という意味ではありません。
11111011を、表現方法を指定して読みます。
2の補数の作り方(黄金の3ステップ)
絶対値の数値を2進数で書く(例: 8ビットで +5 は 00000101)
すべてのビットを0と1で反転する(1の補数: 11111010)
最下位ビットに 1 を加算する(2の補数: 11111011 = -5)
2の補数表現では、最上位ビットが0なら0または正、1なら負です。8ビットの範囲は−128〜127、nビットの範囲は−2^(n−1)〜2^(n−1)−1です。
シフト演算のルール:論理シフトと算術シフト
シフトはビット列を左右にずらす操作です。左シフトを2倍と読めるのは、値が表現範囲に収まる場合です。右シフトでは下位ビットが失われ、小数部分の切捨てが生じます。
シフト種別 | 対象データ | 左シフト (×2) の動作 | 右シフト (÷2) の動作 |
|---|---|---|---|
論理シフト | 符号なし整数、ビットパターン | 左にずらし、空いた右端に「0」を補充 | 右にずらし、空いた左端に「0」を補充 |
算術シフト | 符号付き整数(2の補数) | 試験で符号ビットを保持する定義の場合は、符号以外を左へ移動し、右端を0で埋める。言語・命令の定義を確認する。 | 【空いた左端に符号ビットと同じ値】を補充 |
【算術右シフトの落とし穴】:負の数(符号ビットが1)を算術右シフトする場合、空いた左端には必ず「1」が入ります。もし0を入れてしまうと、負の数だったものが突然正の数に化けてしまいます。
実戦演習:シフト演算と加算を組み合わせた掛け算
正の整数xに対し、2ビット左算術シフトした値と1ビット左算術シフトした値を加算します。各シフトと加算でオーバーフローが起きない場合、元のxの何倍でしょうか。
【選択肢】
- ア
3 倍
- イ
5 倍
- ウ
6 倍
- エ
8 倍
解説と解答
正解:ウ(6 倍)
2ビット左シフト = x × 2^2 = 4x
1ビット左シフト = x × 2^1 = 2x
これらを足し合わせると:4x + 2x = 6x となり、元の値の 6 倍になります。
シフトとオーバーフローを実際の値で確認する
8ビットの2の補数で64は01000000です。全ビットを1ビット左へ移動すると10000000、すなわち−128になります。数学上の128は表現範囲外です。
符号を保持する算術右シフトでは、−3(11111101)を1ビット右へ動かすと−2(11111110)です。0方向に丸める整数除算の−3÷2=−1とは一致しません。
小数と浮動小数点はどう表すのか
2進数の小数点以下は、順に1/2、1/4、1/8の重みです。0.625=1/2+1/8なので、2進数では0.101です。
IEEE 754のbinary32は、符号1ビット、指数8ビット、仮数の小数部分23ビットです。正規化数は、符号ビットsを用いて(−1)^s × 1.仮数 × 2^(格納指数−127)として読みます。
1.5を表す部分 | 値 |
|---|---|
正規化 | 1.1₂ × 2⁰ |
符号 | 0 |
格納指数 | 127=01111111₂ |
仮数の小数部分 | 10000000000000000000000 |
32ビット全体(16進数) | 0x3FC00000 |
10進数の0.1は2進数では有限桁になりません。丸め誤差があるため、浮動小数点の計算結果を厳密な等号で比べる場合は注意が必要です。指数0や全ビット1には、非正規化数・0・無限大・NaNなどの特別な扱いがあります。
まとめ:基数変換と数値表現の確認
16進数と2進数は「4ビット単位」で機械的に置き換える。
負の数は「ビット全反転 + 1」で2の補数を作る。
算術右シフトは「空いた左端に符号ビットと同じ値」を埋める。
左シフトの乗算対応はオーバーフローしない場合。右シフトは、符号と切捨ての扱いを確認する。
出典と仕様を確認する
次におすすめの学習
編集・検証について
編集・検証:IT資格ラボ編集部
IPAが公開する試験要綱・シラバス・過去問題と、各技術の公式資料を優先して内容を確認しています。制度変更や誤りを確認した場合は、記事を見直して更新します。
編集方針・情報源・訂正方針を見る