【AP】ビットで負の数・小数点を表す方法

基本的な知識を復習しつつAP対策するシリーズ。
この記事ではビットで負の数や小数点を表す方法をまとめます。

固定小数点と整数

いま、8bitの二進数で数値を表すとします。

f:id:halya_11:20190504123601p:plain

ここで、小数点の位置を「何bit目」と決め打ちすると小数を表すことができます。

f:id:halya_11:20190504124002p:plain

このように小数点の位置を固定して小数を表現する方法を固定小数点と呼びます。
整数は「一番右に小数点を置いた固定小数点」として扱われます。

f:id:halya_11:20190504124633p:plain

負の数の表し方

今、8bitの整数が表せる範囲について考えます。

2進数 10進数
00000000 0
00000001 1
11111111 255

このように8bitでは0〜255までの256段階を表すことができます。

次に、同じ8bitで負の整数まで表すことを考えます。
この場合、一番左の1bitが1であれば負、0であれば正というルールにします。
残りは7bitなので、正の整数は0〜127まで表せます。

2進数 10進数
00000000 0
00000001 1
01111111 127

同様に負の値は-1〜-128まで表せることになります。

2進数 10進数
10000000 -128
11111111 -1
00000000 0
00000001 1
01111111 127

このように、負の数を表すためには一番左のビットを符号とし、8bitの場合は-128〜127の範囲が表現できます。

1の補数・2の補数

ここで1の補数と2の補数の説明をします。
今、8bitの2進数を考えます。

00110010 (50)

これの各ビットを反転します。

11001101 (-51)

このように元の値から各ビットを反転したものを1の補数と呼びます。
次に1の補数に1を足します。

11001110 (-50)

このように1の補数に1を加えたものを2の補数と呼びます。

負の値は2の補数

前節の例を見ると、元の値の2の補数は元の値の符号を負にしたものであることがわかります。

  • 00110010 (50)
  • 11001110 (-50)

このように、ある値の2の補数を求めると、ある値の符号を反転させたものが得られます。

バイアスをかける

さて、8bitの符号付き整数は次のように表せました。

2進数 10進数
10000000 -128
00000000 0
01111111 127

これは負の値が2の補数で表現できるという意味で便利ではあるのですが、
この二進数で表された値同士を比較するときに大小の比較が少しやりづらいです。
このようなときには、10進数の値に128を加えた値の二進数を求め、それを使います。

元の10進数 +128した10進数 ←の2進数
-128 0 00000000
0 128 10000000
127 255 11111111

これにより二進数の値から簡単に大小の比較ができるようになります。
このように補正をかけることをバイアスをかけるといいます。

浮動小数

小数をビットで表すには浮動小数点の形式を使います。
例えば、今0.625という10進数をビットで表現するとします。
まず、10進数を2進数に変換します。

0.625 (10進数) -> 0.101 (2進数)

次にこれを {1.A \times 2^{B}}の形式にします。これを正規化といいます。

0.101 (2進数) ->  {1.01 \times 2^{-1}} (正規化)

ここで、小数点以下を仮数部、指数部分を指数部と呼びます。

f:id:halya_11:20190504194131p:plain

この仮数部と指数部を次のようなビット列に格納していきます。

f:id:halya_11:20190504193158p:plain:w300

一番左の1bit(赤い部分)は符号です。

オレンジ色の8bitには指数部を入れます。
が、この際に+127のバイアスをかけます。
つまりこの8bitには、-1+127=126を2進数にした01111110を入れます。

最後に緑色の部分には仮数部を左詰めでそのまま入れます。

したがってこの浮動小数点は次のようなビット列で表現されます。

0 01111110 01000000000000000000000

浮動小数点の形式により {0.1A \times 2^{B}}の形式だったり、
バイアスの値が異なったりはするものの、同様の手順で変換できます。

過去問

www.ap-siken.com

www.ap-siken.com

www.ap-siken.com

www.ap-siken.com

www.ap-siken.com

参考

過去問は下記のサイトのものを使わせていただいております。
www.ap-siken.com

www.altima.jp

www.altima.jp