- 1の補数と2の補数
コンピュータではマイナスの値を2の補数を使って表します
補数を使えば減算を加算で行うことができます
(※ちょっと混乱しそうですが、本当に出来てしまいます)
・補数
基準値からその値を引いたもので、基数に対し2種類ある
※基準値:同じ桁の最大値
n進数の場合
n-1の補数 |
基準値-その値 |
nの補数 |
n-1の補数+1 |
補数の例
・1の補数
2進数「1011」の1の補数
最大値 |
- |
その値 |
= |
1の補数 |
1111 |
- |
1011 |
= |
0100 |
※2進数ではビット反転でも良い
・2の補数
2進数「1011」の2の補数
最大値 |
- |
その値 |
+ 1 |
= |
2の補数 |
1111 |
- |
1011 |
+ 1 |
= |
0101 |
※2進数ではビット反転+1でも良い
- 負数の表現
符号を使わずにマイナス値を表現する |
|
↓ |
|
表現可能な範囲を2つに分ける
(プラス領域とマイナス領域)
例:4桁の2進数
0000から1111 |
0000から0111 |
1000から1111 |
プラス |
マイナス |
|
|
↓ |
|
ある正の値の「2の補数」をその値の負数とする
(※マイナス値を2の補数で表現)
プラスの値 |
|
マイナスの値 |
増
え
る
と
↓
大
き
く
な
る |
0001 |
→ |
1111 |
減
る
と
↓
小
さ
く
な
る |
10進で「1」 |
|
10進で「-1」 |
0111 |
→ |
1001 |
10進で「7」 |
|
10進で「-7」 |
|
|
- 10進の負数->2進の負数
<変換手順>
- 「10進の負数」->10進の正数
- 10進の正数->2進の正数
- 2進の正数->「2進の負数」
10進
↓ |
-30 |
30 |
2進 |
00011110 |
11100010 |
- 減算を加算で行う
例:10進の「5-2=3」
10進の5は2進で「0101」
10進の2は2進で「0010」
10進の-2は2進で「1110」
4桁のみ有効とすると、5桁目の1が消えて
「0011」
2進の「0011」は10進で「3」
※減算を加算で行えたことになる
- シフト演算
ビット列を左右に移動
(※桁数からもれたものは削除される) |
↓ |
乗除算が行える
(※1ビットシフトすると2倍または2分の1になる)
|
・シフト演算の種類
- 論理シフト
移動時に空いたビットを0にする
- 算術シフト
左シフト時は空いたビットを0にする
右シフト時ははいたビットを最上位桁と同じにする
(※符号値にする)
算術シフトの例
右へ1ビットシフト |
10進「-2」 |
|
10進「-1」 |
2分の1 |
110 |
→ |
111 |
左へ1ビットシフト |
10進「-2」 |
|
10進の「-4」 |
2倍 |
110 |
→ |
100 |
(※論理シフトで右シフトの場合は若干異なる)
|