整数の10進・2進・16進数の変換に関しては、データの内部表現(数値)(hs-naibu-suuchi)を参照してください。
シフト演算、小数点以下の基数変換、補数、浮動小数点
シフト演算とは、2進数の計算を高速にする演算方法です。
例えば、8ビットの2進数
0001 0010 (=16+2=18)
を左に1ビットシフトすると(右端には0を詰める)、
0010 0100 (=32+4=36)
になります。これは21倍したことになります。
同様に、左に2ビットシフトすれば、22=4倍になります。
右に1ビットシフトすると(左端には0を詰める)、
0000 1001 (8+1=9)
となり、2-1=1/2倍したことになります。
これを組み合わせることにより、
「元の数Aを左に1ビットした数に、Aを左に2ビットシフトした数を加える」
と、2A+4A=6A の計算をしたことになります。
上の2進数を右に4ビットシフトすると、
0001 0010
→0010 0000
また、右に2ビットシフトすると
0001 0010
→0000 1000
となり、赤のビットが消えてしまい、正確な値になりません。
これをオーバーフロー、アンダーフローといいます。
右のような表を作成すれば,簡単に計算できます。
10進数から,0.5(=1/2),0.25(=1/4),0.125(=1/8),・・・,を負にならないように引いていき,0にすることができれば変換できます。
たとえば0.8125は,
0.8125=0.5 (=1/2 → 0.12)
+0.25 (=1/4 → 0.012)
+0.0635 (=1/16→ 0.00012)
ですから,0.1+0.01+0.0001=0.11012となります。
110101110102
=1102×28+10112×24+10102
=616×162+B16×161+A16
コンピュータでは,演算回路を簡素化するために,加算回路はあるのですが減算回路は持たず,A-Bの減算をA+(-B)として加算にするのです。では,(-B)をどのように表現するのでしょうか?
話を簡単にするために,1語を8ビットとします。10進法の5は2進法では00000101になります。唐突ですがそれに11111011を加えると右上図のように結果は0になります。これから,2進数の11111011を10進数の-5であるとすればよいことになります。そのために,8ビット(1語)の先頭ビットが0ならば正数,1ならば負数であるというように決めるのです。このように決めた体系を2の補数表現といいます。00000101の補数は11111011であり,1111011の補数は00000101です。
補数の求め方は簡単で右下図のように「0/1反転,+1」の操作を行えばよいのです。
以下,[1語8ビットで2の補数体系の2進数]の例をいくつか示します。これから,この体系で表現できる値の範囲は,-128~0~127であることがわかります。
00000000 0
00000001 1
01111111 127
10000000 -128
10000001 -127
11111111 -1
練習問題:1バイト2の補数での2進数11110111→10進数?
固定小数点型では,取扱える数値が限定されますし,非常に大きな数や小さい数を取扱うことができませんので,科学技術計算などでは困ります。このような数値を表現するには,浮動小数点型を用います。
固定小数点数 浮動小数点数
用途 事務処理計算 科学技術計算
値の精度 正確な値 近似値
小数点 一般には整数値 小数点あり(実数)
大小範囲 比較的狭い 非常に広い
例えば、-640を-1.25×29 のように、s・f×reという形式で表現します。ここで、s(-)を符号、f(1.25)を仮数,r(2)を基数、e(9)を指数といいます。すなわち、「±仮数×基数指数」で表現します。
IEEE754(1語32ビット)では、浮動小数点数の表現方法を次のように規定しています。
符号は、正のとき0負のとき1とします。
-640は、-1.25×29 は-2.5×28 や-0.625×10 など、多様に表現できますが、仮数を1.Mのように整数部分を1になるように調整することを正規化といいます。そして、M(0.25)の部分を2進数にしたものを仮数部に入れます。正規化を行うのは、仮数部(23ビット)での有効桁数を大きくするためです。
また、0.001=1.024×2-10 のように、絶対値が小さい数では指数が負になります。それで、20のときE=127、21のときE=128、2-2のときE=125などとなるように、元の指数に127を加えたEを2進数にしたものを指数部(8ビット)に入れます。この操作をバイアスといいます。
すなわち、-1.25×29 を浮動小数点表示すると、次のようになります。
S E(指数部、8ビット) M(仮数部、23ビット)
1 010001000 0100 … 0000
(-) (9+127=136) (1.25-1=0.25)
解答
符号が0→正数
指数部=1000 01102=13410=127+7→27
仮数部=0010 0000 … 00002=2-3=0.125
これに整数部の1を加えて、1.125
答 1.125×27=140.625
整数部分
2 )23
2 )11 -- 1
2 ) 5 -- 1
2 ) 2 -- 1 → 10111
2 ) 1 -- 0
0 -- 1
小数部分
0.25
× 2
0.50 -- 0
× 2 →0.01
1.00 -- 1
答:10111.01
1 0111 .0100
↓ ↓ ↓
1 7 . 4
答:17.4
アイウエ
1011
+ 0011
1110
エ:1+1は,2ではなく102になる。1が繰上がる。
ウ:1+1+1(繰上り)で112になる。
イ:0+0+1(繰上り)で1。繰上がりはない。
ア:1+0で1となる。
いったん10進数にして計算し,それを16進数にする方法も考えられる。(初心者)
4916→4×16+9=7310
7D16→7×16+13=12510
73+125=198
19810=12×16+6→C616(答)
16進数を直接に加算してみる。(上級者)
ア イ
4 9
+ 7 D(13) イ:D16は1310。9+D→2210となるが,
22 =16+6 それは1616である。
↓ すなわち,合計のイは6となり,
+ 1 6 アに116が繰り上がる。
12 ア:4+7+1(繰上り)→1210となるが,
↓ それはC16である。
C したがって,49+7D=C6となる。
過去問題:「数値表現・基数変換(上級)」