More Related Content
AtCoder Regular Contest 018 解説 Viewers also liked (20)
できるプログラマーを本気で育てるSwift超入門iosプログラマーへの第一歩 Cvim saisentan 半精度浮動小数点数 half 図解入門最新マーケティング・リサーチがよーくわかる本(3) 浮動小数点(IEEE754)を圧縮したい@dsirnlp#4 科学技術コミュニケーションの原点と座標軸20150517(本編) 今日こそわかる、安全なWebアプリの作り方2010 金勘定のためのBigDecimalそしてMoney and Currency API Similar to 計算機理論入門03 (20)
Schönhage Strassen Algorithm Financial training chapter2 2nd 'Sequence' 【Unity道場】ゲーム制作に使う数学を学習しよう AtCoder Beginner Contest 023 解説 More from Tomoyuki Tarumi (8)
計算機理論入門03
- 1. 計算機理論入門 3
2012 年度後期
垂水共之
tarumi@ems.okayama-u.ac.jp
20121003
20121017 講義終了後、誤植を修正
- 2. 2 進数、 8 進数、 10 進数、 16 進数
• 10 進数
– 0から9まで 10 種類の「文字」を使い
10のベキ乗で位取り
例1) 1 2 3 = 1 × 102 + 2 × 101 + 3 × 100
↑ ↑ ↑
10 2 10 1 10 0
の の の (例2) 1 0 1 = 1 × 2 + 0 × 2 + 1 × 2
2 1
位 位 位 ↑ ↑ ↑ = 4 + 0 + 1
22 21 20
の の の
位 位 位
• 2進数
– 0と1の 2 種類の「文字」を使い
2のベキ乗で位取り
– 電気の Off 、 On に対応して0,1
– ビット (bit) 0,1の 2 つの状態しか取れない情
報の単位
- 3. 進数表記
• 101
– 10 進数?
– 2 進数?
• 101 (10)
• 101 (2)
• ああ
- 4. 10進2進変換(その1 整数の場合)
• 2 進数 to 10進数
– (位取り)2進数の各桁に2の対応するベキ乗をかけて加える
bn bn-1…b2 b1 b0
= bn × 2n+bn-1 × 2n-1+…+b2 × 22+b1 × 21+b0 × 20
ここにbn,bn-1,…,b2,b1,b0は0か1.
• 10 進数 to 2進数
– 10進数の値を2で割ってその余りを,商が0になるまで求め
て行く
– 上の式の両辺を2で割れば、 1 桁右にずれて
bn bn-1…b2 b1 b0 ÷ 2
= bn bn-1…b2 b1 余り b0
bn × 2n +bn-1 × 2n-1+…+b2 × 22+b1 × 21+b0 × 20 ÷ 2
= bn × 2n-1+bn-1 × 2n-2+…+b2 × 21+b1 × 20
余り b0
- 5. a0を与えられた10進数としたとき,
a1 = a0 ÷ 2 + b0
a2 = a1 ÷ 2 + b1
:
an = an-1 ÷ 2 + bn-1
an+1 = an ÷ 2 + bn
ここに bi(i=0,1,…,n)は0か1,an+1=0 とする。
このとき,
a0(10)=bn bn-1 …b2 b1 b0(2)
となる。
- 6. 例 3 10 進数の123を 2 進数へ変換
2)123
2)61 ...1(=b0)
2)30 ...1(=b1)
2)15 ...0(=b2)
2)7 ...1(=b3)
2)3 ...1(=b4)
2)1 ...1(=b5)
0 ...1(=b6)
よって 123(10) = 1111011(2)
- 7. 10進2進変換(その2 純小数 (整数部の無い)
の場合)
• 2進数から10進数に変換するには,下のように2進数
の各桁に2の対応するベキ乗をかけて加えればよい。一
般には次式で表される。
0.b-1b-2b-3……………(2)
= b-1 × 2-1+b-2 × 2-2+b-3 × 2-3……………(10)
ここにb -1 ,b -2 ,…,b -(n-1) ,b -n は0か1
• この式の両辺を2倍すると小数点の位置が一桁右にずれ
b-1.b-2b-3……………(2)
= b-1+b-2 × 2-1+b-3 × 2-2……………(10)
• となり、整数部にb-1が浮かび上がってくる。整数部の
b-1を横に置いて、
0.b-2b-3……………(2)
= b-2 × 2-1+b-3 × 2-2……………(10)
- 8. (例4) 0.1 (10) を2進数に変換する。
0.1
× 2
|----------------------- 0.2
| × 2
||---------------------- 0.4
|| × 2
|||--------------------- 0.8
||| × 2
||||-------------------- 1.6
|||| × 2
|||||------------------- 1.2
||||| × 2
||||||------------------ 0.4
↓↓↓↓↓↓
0.000110……………
• 以下同様に行えば、 0011 が繰り返す循環小数とな
る
0.1(10) = 0.00011(2)
- 10. 8 進数、 16 進数
• 10進数を2進数に変換すると,桁数が多くる。
• このため3個ずつ区切って8進数(23=8)で表現す
ることも多い。
(例5) 1 | 111 | 011(2) = 173(8)
= 1 × 82+7 × 81+3 × 80
• 近年は別の理由から4個づつ対応させて16進数(24
=16)で表現することが多い。
– 16進数では1つの桁を表すのに16種類の文字がいるので,
0,1,…,9,A,B,C,D,E,Fを用いている。
(例6) 111 | 1011(2) = 7B(16)
= 7 × 161+13 × 160
- 11. 進数変換
10進数 2進数 8進数 16進数
0 0000 00 0 • 【注意】8進数、1
1 0001 01 1 6進数に変換する場
2 0010 02 2
3 0011 03 3
合、2進数を経由し
4 0100 04 4 なくてもよい。
5 0101 05 5 • 10進2進の変換方
6 0110 06 6
7 0111 07 7 法で2をかけたり、
8 1000 10 8 2で割ったりすると
9 1001 11 9 ころで、2の代わり
10 1010 12 A
11 1011 13 B に8、または16を
12 1100 14 C 用い、余り、または
13 1101 15 D 整数部を取り出せば
14 1110 16 E
15 1111 17 F よい。
- 12. ビット、バイト、語
• ビット(bit)
– 計算機の最小記憶単位であり,1ビットで0,1の2種類の状
態を表現する。
• バイト(Byte)
– 文字の記憶単位であり,昔の計算機では1つの文字を表現する
のに6ビットを用いるものが多かったが,近年の計算機では1
つの文字を表現するのに8ビット又は9ビットを用いている。
これをバイトという。
• ニブル( nibble )
– 最近は1B=8 bits のマシンが増え、 16 進数で表現する機会が
増えてきた。このため 16 進数一桁に対応する 4bits を「ニブル
」という。
- 13. • 語 word
– 数値の記憶単位であり,そのビット数は機種によりまちまちで
ある。近年のマイコンを除き次のような数の機種がある。
– 1語 = 16ビット
– = 32
– = 36
– = 48
– = 60
– 以前は小型,中型では16ビット(=2バイト)、大型では3
2ビット(=4バイト)以上と分かれていたが、近年では32
ビットが普通になった。昨年あたりから64ビットが普及し始
めている。
– 以下の例では1バイト=8ビット,1語=16ビット=2バイ
トで述べることが多い。
- 14. 数値の表現形式
• 数値の記憶単位である「語」の中に、実際の値をどのよ
うに格納するか、それが「数値の表現形式」である。
– 固定小数点形式 fixed binary
– 浮動小数点形式 flowting binary
– 10 進数形式 BCD = binary coded decimal
• よく用いられるのは上の2つ、固定小数点形式と浮動小
数点形式である。
- 15. 固定小数点形式 fixed binary
• 小数点の位置が固定された表現形式
‥‥通常,最右桁の次に小数点の位置を仮定する‥‥
であり,通常整数値に用いる。
(例1) 7の固定小数点表現
0000000000000111
↑
ここに小数点を仮定する
- 16. 浮動小数点形式 flowting binary
• 固定小数点形式では小数点の位置が固定されているため
通常の実数(少数)を表現できない。
• このため10進数の精度表現で用いたように
1500 と 0 . 15 × 10 4
小数と10のベキ乗の積という形と似た形式で表現する
のが浮動小数点形式である。計算機では10のベキ乗と
は限らず一般には
0.m 1 m 2 ・・・ × be 1 e 2 ・・・
(例えば,0.1101 (2) × 2 11(2) = 110.1 (2) = 6
.5 (10) )
という形式で表す。ここで
m 1 m 2 ・・・ の部分を〈仮数部〉,
e 1 e 2 ・・・
の部分を〈指数部〉,
b を〈底〉という。
- 19. 符号付き絶対値表現
• 1語を構成するbit列のうち,特定のビットが符号を
表すことにする。
• 通常第0ビットを符号に用い,オフ(0)のとき 正
又は 零,オン(1)のとき 負を表す。
• 残りのビットは符号を除いた絶対値を固定小数点形式で
表現する。
(例1) 10(10) = 0000000000001010(2)
↑
正
-10(10) =1000000000001010(2)
↑
負
- 20. 下駄上げ表現
• 負数の表現形式の一つとして、「下駄はかせ」の方式が
ある。いわゆるテストの点数に下駄を履かせて成績を付
けるやつである。テストの点数の場合には0点から10
0点までの値しかなく、下駄を例えば30点とすれば、
テストの生点に30点加えたものが成績の点数になる。
• 計算機の値の表現の場合も考え方は同じで、表現したい
生の値に「下駄」の値を加えた値を,内部的に表現する
ことにする。「下駄」の値としては最左端ビットだけを
1にしたもの(1語nビットの場合 2 n-1 )を用いるの
が普通である。
- 21. 下駄上げ表現(つづき)
100 (10) =1100100 (2) をあらわす場合、
0000000001100100
+)1000000000000000 ( 下駄 )
1000000001100100
-100 (10) では
1000000000000000 ( 下駄 )
-)0000000001100100
0111111110011100
• 結果的に最左端ビットが符号を表すことになり、0
の時負、1の時正の値を表す。
• この下駄上げ表現は「浮動小数点」の「指数部」
の表現として使われることが多い。
- 22. 2の補数表現
• 与えられた負数の絶対値を固定小数点表現したものを,
各ビットの0,1を反転し(“1の補数”という),
その値に1を加える(“2の補数”という)
• これを,与えられた負数の表現形式とするものであり,
結果として第0ビットが符号を表す。
(例2) -10(10)の“2の補数表現”
絶対値 (+10(10)) 0000000000001010
ビット反転(1の補数) 1111111111110101
1加える (2の補数) 1111111111110110
• 負数の絶対値の求め方
与えられた負数 1111111111110110
ビット反転 0000000000001001
1加える 0000000000001010
- 25. 練習問題
• 問1 10 進数の123.675を 2 進数、 8 進数、 16
進数に変換しよう。
• 問2 10 進数のー123を 2 進数、 8 進数、 16 進数に
変換しよう。
• 問3 なぜ 2の補数表現,1の補数表現と呼ばれるか
浮動小数点の仮数部に適用して考えよ。
• 問4 1語のビット数をnとしたとき符号つき絶対値表
現,2の補数表現とでは,各々どのような値の範囲を表
現できるか?
- 26. 単位 KMGTPE
• 計算機では2進数が使われるため、2の巾乗で数えるこ
とが多い。2の10乗が1024と1000に近いため
、計算機の世界では2 10 を1K(キロ)として取り扱う
。すなわち、
1K(キ ロ) = 210 = 210 (千)
1M(メ ガ) = 210K = 220 (百万)
1G(ギ ガ) = 210M = 230 (十億)
1T(テ ラ) = 210G = 240 (一兆)
1P(ペ タ) = 210T = 250 (千兆)
1E(エクサ) = 210P = 260 (百京)
- 28. 32bits 単精度
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
符 指数部( 8 ビット) 仮数部( 23 ビット、ケチ表現)
号
• 指数部
– 下駄 01111111
– 1 ~ 254
– 0 のとき、仮数部0であればゼロ
– 255 のとき、無限大(仮数部0)、または NaN (仮数部 非
0)
• 仮数部
– 絶対値表現
– 1.xxxx に正規化し、頭の1は記録しない
64bits 倍精度 128bits4 倍精度
指数部 11 ビット 指数部 15 ビット
仮数部 52 ビット 仮数部 112 ビット
- 29. 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
符
指数部( 8 ビット) 仮数部( 23 ビット、ケチ表現)
号
3 F 8 0 0 0 0 0
0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3F800000 10 進数に直すと?
10 進数の -118.625 はどんなビット配列になるかな?