基数変換

第2回 情報処理技術講義
コンピュータ計算の基本概念
ピ
タ計算 基本概念
(記数表現と計算)
24
講義内容(Introduction)
第1回で説明したように,コンピュータは得意な繰り返し計算を
第
回 説明
う ,
タ 得 な繰り
計算を
行うことで様々な情報処理を実施している.
その操作や考えを知ることは,情報処理の実施やコンピュ
その操作や考えを知ることは
情報処理の実施やコンピュータ
タ
を活用していく上で必要不可欠である.
そこで,本節ではコンピュータ計算の基本概念を以下の項目に
そ
本節 は
ピ
タ計算 基本概念を以下 項目に
分けて説明を行う.
・記数表現と計算(復習)
・プログラムと論理
グラ と論理
・論理を実現するハードウェア
25
記数法(numerical notation)
我々は数学を使うにあたって,10進法(decimal notation)を使用
[特殊例として60進数(Sexagesimal notation):分,秒など]
しかし,コンピュータで10進法を扱おうとすると都合が悪い
コンピュータは間違えてはならない
電気信号を多数分割すると不安定因子がいっぱい
立上り応答
コンピュータは計算が早くなくてはならない
四則演算ルールが複雑で計算が遅くなる
シュートやノイズ
(電気信号の不安定)
コンピュータ計算では2進法(binary notation)を使用
[組織表現として16進法(hexadecimal notation)を使用する]
26
記数法(numerical notation)
2進法への変換(transform to binary notation)
10進数を2進数に変換
2
2
2
2
2
2
2
2
2
201
100
50
25
12
6
3
1
0
16進数への変換
0
1
2
3
:
:
:
:
0000
0001
0010
0011
4
5
6
7
:
:
:
:
2で割り,余りを下から並べる
…1
…0
…0
…1
…0
0
…0
…1
…1
1
0100
0101
0110
0111
(Dec)201=(Bin) 11001001
2進数→10進数
2進数
10進数
(1*)27+(1*)26+(0*)25+(0*)24+(1*)23+(0*)22+(0*)22+(1*)20=
128+ 64+
0+
0+
8+
0+
0+
1=
= (Dec)201
16→2進数は以下の通り.10進数変換は2進数を媒介する
8
9
A
B
:
:
:
:
1000
1001
1010
1011
C
D
E
F
:
:
:
:
1100
1101
1110
1111
(Hex)C9=(Bin) 11001001
0
1
2
3
:
:
:
:
000
001
010
011
4
5
6
7
:
:
:
:
100
101
110
111
8進数も同じ
(Oct)27=(Bin) 010111
27
記数法(numerical notation)
10進数を2進数に変換すると,言葉で伝えにくい (Dec)128=(Bin) 10000000
「128だよ」 → 「いち ぜろ ぜろ ぜろ ぜろ ぜろ ぜろ ぜろ」
そこで…
ケンシ ウ進法(K
ケンシロウ進法(Kenshiro
hi notation)
t ti )
10進法
0
1
2
3
4
2進法
0
1
10
11
100
ケンシロウ進法
た
あ
あた
ああ
あたた
とすると,
128 = 10000000 = “あたたたたたたた” と,口頭伝達効率が2倍にUPする!
, 頭伝達効率
倍
する
http://www.haratetsuo.com/index.html
(教育活用専用)
ギャグですよ!
28
記数法(numerical notation)
大真面目な話…
情報は伝達する手段や伝える相手によって最適値が異なる
2進数は電気通信で送信するには都合が良いが,音声では大変
このように情報をどのような形で送れば,正確で効率が良いか
情報理論(後で学びます)
バーコードから画像圧縮,暗号化まで応用ができます
で うまく乗り越えられたかな?
で,うまく乗り越えられたかな?
しつこい!
う~ん.間違いにくいという意味でもケンシロウ進数はすごいかも!
29
記数法(numerical notation)
2進法への変換(transform to binary notation)
10進数小数を2進数小数に変換
(1*)23+(0*)22+(0*)22+(1*)20と同様に, 2-1 2-2 2-3…とする
2-1 =0.5
2-2 =0.25
2-3=0.125
整数部は2で割ったので,小数部は2をかける
10進数
0.6875×2
0.375×2
0.750×2
0.500×2
小数のみ
…整数部(1)
…整数部(0)
…整数部(1)
…整数部(1)
=1.375
=0.750
=1.500
=1.000
= 0.1011
0 0
小数部が0になるまで続ける
(問)6.4375を2進数で示せ
(Hint : 整数部と小数部は分けて考える)
30
記数法(numerical notation)
ここまでのコンテンツについての補足
位取り記数法…数の表現を基準となる数(基数)の繰り返しで行うこと
基数変換…10進数→2進数のような変換のこと
デ タ単位 以下の通り
データ単位…以下の通り
bit
word…コンピュータにより様々だが,2byteを指す場合が多い
0 1
0,1
byte
byte
固定小数点…最下位ビット右側もしくは最上位ビットの右側を小数点と
する表現方法
小数点
小数点
浮動小数点…有効数字を一定に保つため,指数を導入した表現方法
72.56×10-5
仮数部
基数
指数
31
記数法(numerical notation)
2進法の演算(calculation with binary notation)
加算:論理和演算
(Dec)6=0110
+(Dec)3=0011
注意…最上桁上げ考慮の有無
1 1
1 0 0 1 =(Dec)9
減算:2の補数に変換して加算
(Dec)6=0110
‐(Dec)3=0011
(Dec)3=0011
(Dec)3=1100
(D
)3 1100
+
1
‘
(Dec)3=1101
(Dec)6=0110
‘
+(Dec)3=1101
(
)
0011 =(Dec)3
反転させる
(1の補数)
1を加える
(2の補数)
最上桁上げ考慮無
最大桁を符号として使う方法
もある(各自確認せよ)
‐2(n‐1)~2(n‐1)‐1
8bitなら
‐128~127が表現できる
32
記数法(numerical notation)
2進法の演算(calculation with binary notation)
乗算:論理和演算
(Dec)3=0011 乗算は10進法と同じ
×(Dec)3=0011
0011
+ 0011
1 1
1001 =(Dec)9
徐算:桁を合わせ、引ければ「1」を、引けなければ「0」をたてていく
(Dec)10=1010
÷(Dec)3=0011
0011 =(Dec)3
(Dec)3 あまり(Dec)1
あまり(Dec)1
0011 1010
‐ 0011
0100
‐ 0011
0001
0101 ‐0011
=0101+1101 =0010
(2の補数)
最上桁上げ考慮無
げ考
33
記数法(numerical notation)
2進法の演算(calculation with binary notation)
ここで,乗算も除算も計算過程をみると,桁がずれているだけ
(Dec)3=0011
0011
0011 1001
00
00
×(Dec)3=0011
×(Dec)3
0011
‐
0011
0011
0011
+ 0011
‐ 0011
1001
0
→論理シフトを使うと乗算や除算が楽にできる
(Dec)2×(Dec)2 0010×0010
(Dec)2×(Dec)2=0010×0010
=0010×21 →0010を左に1ビットシフト
→0100=(Dec)4
(Dec)2×(Dec)3=0010×0011
=0010×21+0010×20
→0010を左に1ビットシフト
+ 0010を左に0ビットシフト
0010を左に0ビ トシフト
→0100+0010=0110=(Dec)6
(Dec)4÷(Dec)2=0100÷0010
=0100÷21 →0100を右に1ビットシフト
→0010=(Dec)2
注意:除算自体,ビットシフトを利用している
ので,楽になるのは2nで割るときのみ
34
記数法(numerical notation)
2進法の演算(calculation with binary notation)
少数の乗算も同様に行える
(Dec)0.75=0.11
×(Dec)0.75=0.11
×(Dec)0.75
0.11
0.0011
+ 0.011
0.1001
(Bin)0.1001=0.5+0.0625 = (Dec)0.5625
(Bin)0.11×(Bin)0.11
=0.11×2-1+0.11×2-2
→0.11を右に1ビットシフト
+ 0.11を右に2ビットシフト
→0.011+0.0011=0.1001=(Dec)0.5625
0 011 0 0011 0 1001 (D )0 5625
少数の除算は整数までビットシフトすると楽
(Dec)0.1875÷(Dec)0.125
= (Bin)0.0011÷(Bin)0.001
両辺を5ビット左シフトして
= (Bin)11÷(Bin)10
= (Bin)1.1
( )
= (Dec)1.5
1.1
10 11
‐ 10
1.0
‐ 1.0
0
35
記数法(numerical notation)
ここまでのコンテンツの補足
オーバーフロー…演算の結果,表現できる範囲を超えてしまうこと
アンダーフロー…演算の結果,表現できる範囲より小さくなること
けた落ち 演算の結果 有効数字が減少してしまうこと
けた落ち…演算の結果,有効数字が減少してしまうこと
0.987654-0.987653 = 0.000001
情報落ち…非常に情報の少ない数値を演算すると,その情報が反映されない
987654+0.00001 = 987654
丸め誤差…四捨五入や切り捨てなどによって発生する誤差
IEEE単精度 the Institute of Electrical and Electronics Engineers inc
IEEE単精度…
inc. が制定した精度形式
非数…NaN(Not a Number)
文字コ ド…様々な言語に対応した変換コ ドのこと.以下のようなものがある
文字コード…様々な言語に対応した変換コードのこと.以下のようなものがある
JISコード…Japan Industrial Standard cord
シフトJISコード…Microsoft社策定で,文字の1バイト目で漢字か半角英数字を見分ける
EUCコード…Extended UNIX code
EBCDIC Extended Binary Coded Decimal Interchange Code
EBCDIC…Extended
UNICODE…全ての文字を2バイトで表現して各国語コードに対応させる
36
記数法演習(program practice)
講義ばかりでは面白くないので,計算機で実際に2進演算をやってみよう
今回使うソフトウ アは
今回使うソフトウェアは…
MATLAB(Mathworks社)
・Cに似た制御構文
(if, while, for, switch...)
・インタプリタ型言語
・弱い型付
弱い型付
・行列計算に特化した構文規則
・m-file単位でのプログラム管理
制御系の人はよく使っている.大学へ進学する人は覚えておくと得.
就職する人も近頃は研究や開発部門で使われ始めて る
就職する人も近頃は研究や開発部門で使われ始めている.
研究開発 ○
最終目的物はプログラムそのものではない
仕様が曖昧、仕様がどんどん変わる
早く成果すなわち解析結果が出ればよい
プロトタイプ開発
実製品 △
最終目的物はプログラムそのもの
実行効率、低コスト、可搬性、品質保証
37
記数法演習(program practice)
動作方法,記述方法
←ダブルクリック
新規作成
コマンドライン
WorkSpace
M_fileエディタ
38
記数法演習(program practice)
行列を想定したプログラミング
(例)結果の非表示
>> A=1;
>>
(例)1行3列の行ベクトル変数C1
>> C1=[1 2 3]
C1 =
1 2 3
(例)3行1列の列ベクトル変数C2
>> C2=[1;2;3]
C2 =
1
2
3
(例)2行3列の実数行列変数D
例 行 列 実数行列変数
>> D=[11,12,13;14,15,16]
D=
11 12 13
14 15 16
(例)2行3列のゼロ行列m1
>> m1=zeros(2,3)
m1 =
0 0 0
0 0 0
(例)1行4列の一様分布する乱数ベクトルm2
>> m2=rand(1,4)
m2 =
0.9501 0.2311 0.6068 0.4860
(例)1行10列の等間隔ベクトルm3
例 行
等 隔ベク
等間隔ベクトルはコロン:を使って、「初期値:増分値:最
終値」というフォーマットで定義します
>> m3=1:3:30
m3 =
1 4 7 10 13 16 19 22 25 28
http://www.gsic.titech.ac.jp/~ccwww/tebiki/matlab/matlab5.html
39
記数法演習(program practice)
いろんな機能
(例)画像の読み込み
>>load clown
>> clims = [10 60];
>> imagesc(X,clims)
>> colormap(gray)
(例)連立方程式の解法
>> A=[3,4;2,5];
>> b=[6;8];
>> x=inv(A)*b
x=
-0.2857
1.7143
(例)Sinカーブ、Cosカーブのプロット
>> x=0:pi/8:2*pi;
>> y1=sin(x);y2=cos(x);
>> plot(x,y1,'g-o',x,y2,'r*')
(例)音の再生
load handel;
>>load
>>sound(y,Fs);
*ボリュームに注意して!
>> load laughter;
sound(y,Fs);
>>sound(y,Fs);
40
記数法演習(program practice)
C言語との主な違い
関数 命令
関数、命令
C言語
MATLAB
実行
コンパイル後実行
インタプリタ
配列
0から始まる。
配列は1から始まる。
for文1
for(j=0;j < NUM;j++) {
}
for(j=0;j < NUM;j=j+0.5) {
}
if (n==2) {
a=1;
b=2;;
}
switch (choice) {
case 1:
文1 break;
文1;
b k
case 2:
文2; break;
default:
文;break;
}
for j=0:NUM-1
end
for j=0:0.5:NUM-1
end
d
if n==2
a=1;
b=2;;
end
switch choice
case 1
i 0 01 i
x=-pi:0.01:pi;
case2
plot(x, sin(x));
otherwise
flug = 1;
end
for文2
if文
switch文
41
記数法演習(program practice)
まあ,使ってみよう.まずは10進数→2進数変換から
M_fileを新規作成して,書き込んでいく.Dec2bintest.mとして保存.
書きこんだ文章をすべてコピーして,コマンドラインウインドにペーストし,enter実行
2
2
2
2
2
2
2
2
2
201
100
50
25
12
6
3
1
0
…1
…0
…0
…1
…0
…0
…1
…1
2で割り,余りを下から並べる
2で割り,余りを下から並
る
42
記数法演習(program practice)
何度もコピー&ペーストするのは面倒くさいので…
先ほど作ったプログラムに関数宣言を加えて,関数化する.
保存して,コマンドウインドから以下のように呼び出すと,実行される.
43
記数法演習(program practice)
次に,2進数の加算
先ほどの関数を利用
桁上げ用配列を作っておく
最上桁は桁上げなし
計算結果が”2”の場合
計算結果が”3”の場合
計算結果(配列)
結果を10進数に変えて,確認
では,2進数の減算を自分で作ってみなさい
44