第4話 文字と数値の表し方(その2 2進数) 2進数は,ビット列を規則的に並べて文字と対応させたり,数値を表したりする場合の基本となる。今回は, 2進数の考えについて復習する。 2進数の考え方 10進数 (decimal number)では: 2進数(binary number)では: 1 111012 = 10000 2 + 10002 + 100 2 + 1 = 1610 + 810 + 410 + 1 = 2910 2 進数の n 桁目は 2 n−1 10進数の m 桁目は 10 m−1 2進数を並べてみよう 2進数と10進数の対応関係を確認するため,2進数を0から順番に並べる演習 をやってみよう。 演習問題[1]0~15までの10進数を2進数で表せ。 (左の対応表の空欄を埋めよ。) 10 進/2進対応表 10 進数 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2910 = 2 × 10 + 9 × 1 = 111012 2進数 0000 0001 注意:この演習での2進数の表記は,通常の「位取り記数法」とは異なり,上位の桁の “0”も表記して4桁で表している。 2進数→10進数の変換 これは簡単。しかし,1回は演習をやっておくとよい。(結構,間違う人がい るから。) 演習問題[2] 以下の2進数を10進数に変換せよ。 ①1101 ②10111 ③110010 ④10001001 ----------------------------------------------------------------------------------------------------------------------------------------10 進数 (decimal number) 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-1 10進→2進の変換 例えば次のような方法がある. 2 商 29 1 4 7 3 1 ÷2 ÷2 ÷2 ÷2 ÷2 =1 4 = 7 = 3 = 1 =0 余り ... ... ... ... ... 1 0 1 1 1 値を2で割っていく.商が0となったところで,余りを出た順の逆に並べると2進数表現が得られる. この方法,特に公式の呼び名は無いようだが,この講義では「除算シフト法」(shift by division method)と 呼ぶことにしよう. 考え方 数値を2進数で表して考える.2での除算は2進数を右に1桁シフトする操作に対応する.除算される数 の1の位の値が余りの数になる.したがって2で除算するたびに右端の値が余りの値として現れることにな る.先の例の場合, 11101÷10=1110 ... 1 1110÷10= 111 ... 0 111÷10= 11 ... 1 11÷10= 1 ... 1 1÷10= 0 ... 1 となる. この変換により得られるビット列は,符号なし整数(unsigned integer)つまり0 より大きな正の整数の内部 表現として使われる. 演習問題[3] 以下の10進数を2進数に変換せよ。 ①72 ②54 ③12 ④132 筆算による 10 進/2 進変換の別法(“逐次比較法”, successive approximation*) n n 「 2 より小さかったらそのまま,大きかったら 2 を 引く」という操作を繰り返す(以下は 74 を 2 進変換す る例 )。逐次比較型 AD 変換器と同じ方法。 ①1,2,4,・・・ ②74>64 なので 1 という欄を作る を立て,64 を引く 74 64 32 32 16 16 8 8 4 4 2 2 1 1 74 -64 10 89 = 64 = 64 = 64 → 101 + 25 + 16 + 9 + 16 + 8 + 1 1001 *:これも,正式名称ではない 上の桁から求められていく 64 1 ③小さい場合は 0 を 立て,そのまま,と いう操作を繰り返す 1 64 74 -64 0 32 10 -0 0 16 10 -0 1 8 10 -8 0 4 2 -0 1 2 2 -2 0 1 0 n 10進/2進変換の別法 2 分解法* (powers of n two decomposition)( 2 を暗記している人向け) *これも,この講義だけの命名。筆算のやり方は,もっと巧 い方法があるかもしれない。 successive approximation は直訳すると“逐次的近似”。 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-2 8進数 ,16進数 2進数は桁数が大きくなりすぎる.例えば,今のパソコンは32桁,64桁 といた桁数の2進数データを扱う。ところが人間が,読んだり書いたり覚 えたりできるのは,せいぜい8桁程度までなのだ*。そこで4bitをまとめて 0から9までの10個の数字とAからF までのアルファベット併せて16種類の 文字1つで表現するのが16進数である.こうすれば, 10010010110110102 → 92DA16 のように人間にとって扱いやすいものとなる. 表 4.1 10 進/2進/16 進対応表 *:人間が一度に扱えるものごとの数は6~8で,それは人間の短期記憶の容量と 関係している,という説(“Magical Number Seven説”)がある(George Miller : The Magical Number Seven, Plus or Minus Two : Some Limits on Our Capacity for Processing Information, The Psychology of Communication, New York : Basic Books, 1967 )。こ の論文がゼロックスのパロ・アルト研究所(PARC) の研究者によって発表されたの は1950 年代であった。 16進表記は人間のためのもの 10 進 2進 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 11 1011 12 1100 13 1101 14 1110 15 1111 16 進 0 1 2 3 4 5 6 7 8 9 A B C D E F 一方,3ビットずつ区切って0~7の8文字で表すのが,8進数による表記だ。変換が簡単なのだが,2進 2 数は2のべき乗(powers of two)と相性がよいので,4(= 2 )ビットずつ区切る16進表記の方がよく使われ ているようだ。 16進数と2進数の相互の変換は,非常に簡単である。だから,手計算による16進/10進の変換は2進数を介し て行っても良い(10進→2進→16進,16進→2進→10進)。桁数が多い場合は,下の例のようにして直接計算 することもできる。 188 11 0 16 3021 16 188 16 11 16 16 0 ・・・最上位桁Aの10進数値10をたてる A・・・・・ 10 142 28 11 ×16 ・・・16を乗じる 160 128 16 ・・・第2桁Bの10進数値11を加える B・・・・・ + 11 141 12 171 128 ・・・16を乗じる × 16 1026 13 171 2736 11 12 13 4 4・・・・・ + ・・・第3桁4の10進数値4を加える ↓ ↓ ↓ 2740 ・・・これが“AB4”の10進変換値! 1011 1100 1101 302110 = 1011 1100 11012 16 進数→10 進の直接計算の例 10 進数→16 進の直接計算の例 演習問題[3] 以下の2進数を16進数に変換せよ。 ①1100001111100101 ②1001110101110111 演習問題[4] 以下の16進数を2進数に変換せよ。 ①A13C ②2EF4 ----------------------------------------------------------------------------------------------------------------------------------------8進数 (octal number),16 進数(hexadecimal number) 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-3 応用問題[5] 以下の10進数を16進数に,16進数を10進数に,直接変換せよ。 ①5712 ②A84 整数 の内部表現 まず何ビットで表すかを決める n 0 1 · · · · ·1 0 = 8、16、32、64... n ビット 負の数をどう表すか? 整数の内部表現を考えるとき,問題になるのは負の数をどのようにして表現するか,ということである. コンピュータの内部表現では,負の整数は“2の補数”を使って表現される。 以下では説明を簡単にするため8bitで考える。 2の補数 正の数はそのまま2進数で、負の数は2の補数の2進数で表わす 数値 内部表現 2の補数とは 3 -128 100...0 -127 100...01 ... ... 0 00....0 1 00...01 ..... ..... +127 011.....1 (正確には,“ 2 n の補数”) n 桁の2 進数αの補数: 2 n − α ----------------------------------------------------------------------------------------------------------------------------------------整数(integer) ,2の補数(tow’s complement) 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-4 4 2 の補数を使う整数表現の特徴 ◎ n ビットで 2n 個の値を表わせる ◎加減算が簡単になる (加算と減算の手順が同じ、大小比較が不要) ○左端のビットが正負を表す ×乗算は面倒 2進数での2の補数の計算:「各bitを反転し1を足す.」 5 01111110 → 100000000 - 01111110 = 11111111 - 01111110 + 00000001 簡単な回路で実現できる(減算が不要) 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-5 補数の話 10進数の補数:10,100,1000などからある数を引いた数.一般的に表すと,10進数の補数とは, n 桁 n の数 α に対して 10 − α のことを言う. 6875の補数 → 3125 補数の速算法(1万円で6875円の買い物をしたときの釣銭) 6 → 3 (9から6を引く) 8 → 1 (同上) 7 → 2 (同上) 5 → 5 (ここだけは10から引く) つまり,「各桁を9からひいた数に1を足す.」なぜなら α=10000―6875=9999―6875+1 (68750の補数のようにある桁から下位が全て0の場合,その桁は10から引く α=100000―68750=99990―68750+10) 余談 速算術1) コンピュータの教科書の中に「10進数では補数の便利さが見えにくい」という記述があった.しかし,10進数表 記でも,補数を利用することで加算や減算の暗算を速く行うことができる. 例えば, 322+198=322+200―2=520 文献1)は,その他にも数に関する法則を利用した速算法を紹介している.一つ例を挙げてみると, 62×68=4216 →6×7で42,2×8で16 10位以上は同じで1の桁の和は10になる2数の乗算 (10 x + a)(10 x + b) = 100 x 2 + 10(a + b) x + ab = 100 x( x + 1) + ab (a+b= 10 だから) となる.これを応用すると, 15 2 = 225 , 25 2 = 625 , 35 2 = 1225 ..などが速算で求められる. よくあるまちがい 誤例:-18 の8 ビット内部表現 18 = 16 +2 =10010 ビット反転して01101 1 を足して1110 よって答えは 0000 1110(?) → n ビットにしてからビット反転 参考文献 1)波多朝:速算術入門,理工学社(1974) ----------------------------------------------------------------------------------------------------------------------------------------速算術(mental calculation,この英語表現は確認の必要あり。 “暗算”の英語表現として mental arithmetic となっている文 章もあった。 ) 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-6 演習[2] 1)次の十進数を2進数に変換せよ.負の数は8 bit の2の補数表現とせよ. ① 14 ② 1060 ③ -65 2)次の2進数を10 進数に変換せよ. ① 00010010 ② 10010101(符号無し整数で)③ 10010101(2の補数を使う整数で) 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-7 演習問題の解答例 1)次の十進数を2進数に変換せよ.負の数は8 bit の2の補数表現とせよ. ① 14 ② 1060 ③ -65 ①14 = 8 + 4 + 2 = 11102 ②1060 = 1024 + 36 = 1024 + 32 + 4 = 100 0010 01002 ③ 65 = 64 + 1 = 0100 00012 ビット反転して 1011 1110 1を加えて 1011 1111 2)次の2進数を10 進数に変換せよ. ① 00010010 ② 10010101(符号無し整数で)③ 10010101(2の補数を使う整数で) ①000100102 = 16 + 2 = 1810 ②100101012 = 128 + 16 + 4 + 1 = 14910 ③最上位ビット(MSB)が1なので,負の数を表している。 2 の補数を取ることで絶対値を求めると, 1001 0101 ↓ ビット反転 0110 1010 ↓ 1を加算 0110 1011 → 64 + 32 +8 + 2 +1 = 107 以上より,-107 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-8 付録 表4.2 8ビット列と,解釈される整数値 ビットパターン 00000000 00000001 00000010 ・ ・ 01111110 01111111 10000000 10000001 10000010 ・ ・ 11111110 11111111 符号無し整数 0 1 2 ・ ・ 126 127 128 129 130 ・ ・ 254 255 2の補数表現 1の補数表現 0 1 2 ・ ・ 126 127 -128 -127 -126 ・ ・ -2 -1 0 1 2 ・ ・ 126 127 -127 -126 -125 -1 -0 オフセット バイナリ -128 -127 -126 ・ ・ -2 -1 0 1 2 ・ ・ 126 127 符号+絶対値 0 1 2 ・ ・ 126 127 -0 -1 -2 ・ ・ -126 -127 注意: n ①「1の補数」 はn ビットでは( 2 - 1 ) からの減算により定義され,ビット反転で計算される。「1 n −1 n −1 の補数」に1を加算すると「2の補数」が求まる.「1の補数」では,- ( 2 - 1)から+ ( 2 - 1) n までの範囲の 2 - 1 個の数値を表すことができる。(- 0 が存在する). 「1の補数」を使った場合も「2の補数」と同様に,減算を加算によって実行できる.この場合, n+1 桁目への桁あげの処理が「2の補数」の場合と少し違うだけである.どう違うかは各自で調べて みよ. n −1 n −1 n −1 ②「オフセットバイナリ」は,n ビットの場合,- 2 ~ +( 2 -1)の範囲の整数a をa+ 2 の2進数 n −1 変換により表現する方法である.「 2 余り表現」と書いている教科書もある.2の補数表現とは最 上位ビットを反転した関係にある.AD 変換器の出力などで良く使われている. ③「符号+絶対値表現」では,負数の大小関係が,普通の2進数(符号無し整数)のそれと逆になって いることがわかる. その他の表現 以上に述べた他にも多くの数値の表現形式がある.人間は普通,数値を1 0 進数で扱うことに慣れている. そこで,キーボードから数値を入力するような場合に重要となる表現について触れてお く. 表 4.3 BCD 符号 ゾーン10進数表現 キーボードから1 0 進数を入力する.1桁毎に8 ビットの文字コードに変換し,数値を1 0 進数の「固定小数点形式」*で表わす.この中間的な表現を「ゾーン10進数表現」と呼ぶ. *:少数点以上の値,および以下の値を表わす桁数があらかじめ定まった値に固定されて いる表現形式. パック10進数表現とBCD符号 数値のみを扱う場合は,1 0 進数1桁を8ビットで表現するのは無駄が多い.そこで, ゾーン1 0進数表現の1桁を4ビットで表わしたのが「パック10進数表現」である.8ビッ トの文字コードで表された10進数1桁の数字や記号を表3.2のように4ビットの2進数に 変換する.この操作は,0~9の数字に関しては,8ビット文字コードの下位4ビットをそ のまま取り出せば良い. ここで使われている,10進数の1桁を4ビットに対応付けた符号が「BCD(Binary Coded Decimal)」符号である.電卓の表示やデジタルで値を設定する機器など,人間と接する部 分で多く使われている. ----------------------------------------------------------------------------------------------------------------------------------------n 1の補数(one's complement)n 桁の2進数の場合, 2 − 1 から減算した数値のこと。ビット反転で計算できる。 オフセットバイナリ(offset binary),ある範囲の整数を正の値になるようにオフセット値を加えてから2進数に変換した もの。2の補数を用いる表現とは最上位ビットが反転した関係になる。 ゾーン 10 進数表現(zoned decimal format) ,パック 10 進数(packed decimal),BCD(Binary Coded Decimal,2進化 10 進符号) 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-9 補足 2の補数による減算(簡単にするため,桁数 n を 8 としている) ①結果が正になる場合: 2の補数 8 例:104-53 = 0110 1000 - 0011 0101 = 0110 1000 + (2 - 00110101 ) -28 = 0110 1000 + 1100 1011 -28 2の補数を加え = 1 0011 0011 - 1 0000 0000 0110 1000 = 0011 0011 + 1100 1011 → 1 0011 0011 28を引く 1 0011 0011 - 1 0000 0000 0011 0011 のように計算する。これは,「減ずる数の2の補数をとって加算し,結果のn+1 桁目への桁あげを無視 する」ことと同じ結果になる。 ②結果が負になる場合: 53 - 104 = -51 を計算してみる。大小関係の判断は不要で,減ずる数の2の補数をとって加算するだ けである。つまり,0011 0101 + 28 - 0110 1000を計算する。ところが, ( 0011 0101 + 28 - 0110 1000 ) = 28 + (0011 0101 - 0110 1000) なので,これは負の数(0011 0101 - 0110 1000)の2の補数表現になっている。したがって, 0011 0101 + 1001 1000 0 1100 1101 のように,減ずる数の2の補数をとって加算することで正しい結果が得られる。この場合 n+1 桁目 への桁あげは 0 である. まとめると,①,②のどちらでも「減ずる数の2の補数をとって加算し,結果の n+1 桁目への桁 あげを無視」することで減算が可能となる. Fig.4.1に,容量100の容器に入れ た水の量で数値を表す例を示す。 -50~+50の範囲の数値を表現でき る。負の値を,100に足りない分量 で表すのがポイントだ。 2進の補数の場合,左端のビット が1になるレベルで正と負が切り替 わる。 足りない分で 負数を表現 100 70 0000 0001 0000 0000 正の数値 -30 20 2の補数(8ビットの場合) 1111 1111 ・ ・・ 1000 0001 1000 0000 0111 1111 ・ ・・ 負の数値 Fig.4.1 補数の説明 左:10 進数での解釈,右:8ビット整数の場合 2の補数を用いる加減算 減算のとき,減数(引く数)の2の補数を求め,被減数(引かれる数)に加算する。加算の結果でn+1桁目 への桁上がりが発生しても無視する。つまり,加算の結果のn 桁だけを使えばよい。 -40 10 -10 110 30 -20 30-20 = 10 160 90 20 -30 20-30=-10 -10 -30 -10-30=-40 加算の結果,量は 110 となる。 加算の結果,量は 90 となる。こ 加算の結果,量は 160 となる。 しかし,100 を超えた分の 10 が の量は“-10”の内部表現になっ この値の下2桁は 60 で, “-40” ている。 の内部表現になっている。 求める結果になる。つまり“110” の最上位桁の“1”を無視すれば よい。 Fig.4.2 補数を用いる減算の説明(10 進数の例) 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-10 演習問題[3] 整数の内部表現と加減算 以下の計算を,8ビット整数表現を用い,全て加算により実行せよ。 ①105 + 19 ②105 - 19 ③19 - 105 ④-19 - 105 ①105 + 19 ②105 - 19 ③19 - 105 ④-19 - 105 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-11 【解答例】 ①105 + 19 104と53の8 ビット整数表現を求めると, 0110 1001,0001 0011となる。 ・・・・105 = 64 + 32 + 8 + 1 1 1 ← 桁上げ 0110 1001 + 0001 0011 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 (124の内部表現) ②105 - 19 19(0001 0011)の「2 の補数」を求めると, 1110 1101 1 1 1 1 1 ← 桁上げ 0110 1001 + 1110 1101 1 0101 0110 9ビット目への桁上げを無視して 0 1 0 1 0 1 1 0(86の内部表現) ③19 - 105 105(0110 1001)の「2 の補数」を求めると, 1001 0111 0001 0011 + 1001 0111 1010 1010 → 1010 1010 (-86の8ビット内部表現) ④-19 - 105 19と105の2 の補数,1110 1101と,1001 0111を加算する。 1110 1101 + 1001 0111 1 1000 0100 9ビット目への桁上げを無視して 1 0 0 0 0 1 0 0 (-124の内部表現) → 0110 1001, 19 = 16 + 2 +1 → 0001 0011 0001 0011 ↓ ビット反転 1110 1100 ↓ 1を加算 1110 1101 0110 1001 ↓ ビット反転 1001 0110 ↓ 1を加算 1001 0111 1 0 1 0 1 0 1 0 の2 の補数を求めると, 0101 0110となり,86なので,1010 1010 は-86の内部表現であることがわかる。 nビットの整数の場合,加減算は,n ビットの結果だけ使うことにより, 正しい結果が得られる。(ただし, 結果が整数の表現範囲を超える場合 は,そうならないので注意)。 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-12 質問・意見(抜粋)と回答例(Q:質問,C:意見,R:要求,A:回答) C/R:①2 の補数,減算の方法などが,まだよくわからない。 ②補数についてもう少し詳しく説明してほしい。 ③説明が少し 速かった。(複数のコメント) A:今回は,少し内容を詰め込みすぎたかもしれません。2の補数や,2の補数を使った減算は,講義の前半での重 要項目ですし,これに関わる周辺の知識も大事ですので,少し時間をかけたい思います。 C:なぜ最上位ビット(MSB)が1 だと負の数を表すのか,わからなかった。 A:「そうなるように決めた」からです。もう少し詳しく説明すると,負数を2の補数を使って表すことにすると, 補数を求める操作は「ビット反転して1を加える」という簡単な処理になり,減算も加算と同じ方法ででき,お まけに,内部表現の MSB を見ると正負も判定できる,という, 「いいことづくめ」なので,この方法を採用した, ということになります。 C:①回数を重ねるごとにわからなくなる。 (同様のコメントが1 ,2 件) ②前回,わかったと思ったのに,今回わからなくなってい てショックでした。 A:①申し訳ありません。中間テスト前に,演習の時間を1回設定しているので,そこで,完璧に理解してもらうよ うにしたいです。なお。個別に説明させてもらえれば,大抵の人には納得がいくように説明する自信はあります。 個別指導を希望する方は,遠慮せずに申し出てください。 ②だいじょうぶ。もう少し時間をかければ,わかる ようになります。 Q:短期記憶の容量を増やすことはできないんですか?(同様のコメントが複数) A:最近の科学的な研究の成果がどうなっているかは調べてみないとわかりません。しかし,長期記憶の検索方法を 工夫し短期記憶との連携を上手にできるようになると,一目で見た多数の数字や光景を正確に再現することがで きるようになるそうです。これは, “記憶術”として知られています。「検索方法の工夫」というのは,語呂合わ せや,覚えたい人名などを特別な数字や概念に引っ掛けて覚えることだそうです。この方法で訓練すると7桁を はるかに超えたランダムな数字列を覚えて答えることができる,という研究結果があったと思います。 Q:指を使って2 進法を応用すれば 19 歳って片手で表現できて良かった,(普通に表そうとすると,両手+両足を使う必要がある ので・・・) A:普通の人は足の指を折って数を数えることはできないもんね。(できる人がいたら怖いよ・・・。) Q:①なぜ2 進数の計算の練習をするのですか? ②内部表現とは何ですか? A:何回か説明していますが,2進数の計算自体は,日常生活では役に立ちません。しかし,コンピュータは,その 内部ではビットの組合せで数値や文字などを表現しています(これが文字や数値の内部表現)。内部表現と,それ に対する計算の仕組みを理解するためには2進数の理解が欠かせないので,そのために2進数を使った計算の演 習をしてもらっています。 C:2n–αのαが何なのかわからない。(というコメントが予想以上に多い) A:αは n ビットの2進数です。例を挙げれば,α=0101 1011 のような具体的な値で表されるのですが,ビット数 も“n”という式で表していますので,一般化した形でαとして表しました。(“α”ではなく“x”を使えば良か ったかもしれません。a や x などの文字式を使うのは,中学校の数学から習っていると思いますが・・・。) ど うも,こういう一般化した式を出すと,突然,わからなくなる人がいるみたいなので,気をつけるようにします。 Q:資料 4-12 の解答例①105+19 の解答が 0111 1110 となっていたが,これは 0111 1100 が正解ですよね? A:はい。ご指摘の通り,ミスプリントです。その上の“104 と 53 の8 ビット整数表現を求めると”も, “105 と 19 の”に 訂正しておいてください。(別の問題の解答をコピー&ペーストして編集し忘れた・・・。)(Very Good) C:資料 4-3 の表 2.2 の中の 9 の2 進数表記は 1001 ではないのですか? A:はい,講義のときに訂正をお願いしたと思いますが,改めて,お願いします。9 のところを,1010 と訂正してください。 → 1001 C:資料 5-1 の脚注で「不動小数点」となっていました。 A:ありがとうございます。「浮動小数点」に訂正しておいてください。(Very Good) R:-∞と+∞のビット表現は絶対ありえないのか教えてください。 A:浮動小数点表現の表現できる上限は有限ですから,数値としての∞は表現できません。ただし,多くのコンピュ ータで標準となっている IEEE-754 浮動小数点形式では,∞を表すビットパターンがあります。 (もちろん,この ビットパターンは∞を表すことにする,という約束なので,このパターンが出てきたとき,どう処理するかは, 処理のプログラムに依存します。) Q:逐次比較型の A/D 変換器とは何ですか? A:A/D変換器とは,アナログの入力電圧をデジタル値(つまりビット列による表現)に変換するための電子回路の ことです。逐次比較型というのは,基準電圧の1倍,2倍,4倍, ・・・2n倍の電圧を発生して,比較回路により, 入力アナログ電圧とこれらの基準電圧を大きい方から順に比較していき, “アナログ電圧の方が大きかったら,そ のビットを1とし,基準電圧を引いて,残りの値に関して,次のビットの基準値と比較し・・・”のようにして 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-13 変換します。上のビットから順番に比較して求めていくので,“逐次比較型”と呼ばれます。 Q:2 の補数を用いる表現では,乗算は面倒ということですが,どういったところが面倒なのですぁ? A:乗算の場合は,一旦2つの数値の絶対値と符号を検出し,絶対値同士の乗算をし,2つの符号の組合わせから符 号を決定して(+/+,−/− → +,+/−,−/+ → −),再び標準の整数形式に戻す,という操作が必要になるからで す。面倒といいましたが,そんなに面倒ではありませんね。 Q:補数を使うと減算のアルゴリズムを使わなくても済む,ということですが,除算(割り算)が不要な表現はあるのですか? A:除算が不要になる形式,というのは聞いたことがありません。実は,除算の計算には,いろいろ問題があるよう です。 C:今日の中示 B は暑くて集中できませんでした。温度調節ができないのですか? A:申し訳ありませんでした。私も途中で頭がクラクラしました。中示 B は,暑い場合,窓を開けて対応するしか ありません。エアコンはあるのですが,中央で管理されていて室内からの調整はできないのです。中示 A,B な どの温度調節(冬の暖房,夏の冷房)については,何度も工学部の施設管理係にお願いしておりますが,反応が よろしくありません。継続して働きかけていきます。暑い(逆に寒い)場合は,我慢しないで言ってください。 R:配布資料は,並んだ人の行列が出入り口を防ぐことがないよう,前方の中央に2 つに分けて置いて欲しい。 A:わかりました。次回は,そのようにしてみます。 Q:2 の補数に計算をするとき,私は「1 を減じてからビット反転」で計算しました。解答例では「ビット反転して1 を加える」です が,前者の方法でも間違いではないでしょうか? A:どちらも同じ結果になります。xをnビットの2進数とすれば,xの2の補数は,2n–xになります。ビット反転は 2n–1 から減じる操作ですので,「1減じてからビット反転」は 2n−1−(x−1)に,「ビット反転してから1を加える」 は(2n−1−x) + 1 になります。どちらも,2n−xという結果を与えます。コンピュータの内部では減算をしませんので, 後者の「ビット反転してから1加える」方法で説明していますが,方法が違うから不正解にすることはしません。 (Very Good) Q:今のパソコンは 32 桁や 64 桁の2 進数データを扱う,とあるのですが,これはパソコンのスペックで見かける 32bit,64bit の ことですよね。64bit のものは 32bit のものより,どんな点で性能が優れているのでしょうか? A:CPU が1つの単位として扱えるデータのビット数が 32bit の場合でも,64bit データ(例えは double 型の浮動 小数点データ)を扱えます。もちろん,64bitCPU なら,より効率よく 64bit データを処理できます。CPU が一 単位のデータとして扱える bit 数が増えると,一般には以下のような利点があります。①数値データの精度を高 くできる,②同じ処理を少ない命令数で実行できる,③扱えるメモリの量を多くできる,などです。 (Very Good) C:「よくあるまちがい」は,正解も書いておいた方が,理解し易いと思います。 A:はい,指摘の通りです。次回に説明しましょう。(Very Good) Q:①149 と-107 のように,2 進数表現が同一のものを見分けるにはどうしたらよいのでしょうか? ②2 の補数を使った整数表 現と,符号無し整数は,どのように区別するのか? (複数の質問あり) A:内部表現の形だけからは区別できません。プログラムの中で,使う変数の表現形式とビット数は,使う前に“宣 言”により決めておきます。(プログラムについては講義の後半で触れる予定です。) C:①ビット反転の意味がわからない,②なぜ9 ビット目への桁上げを無視するのかが理解できない。 A:nビットの整数表現では,ある数値のビット反転は,この数値を 2n−1 から減算することと同じです。n=8 なら, 1111 1111 から引くということです。ビット反転の後で1を加えれば,2nから減算する操作を引き算回路を使わず に実現できることになります。 ②nビットの表現ではn+1 ビット目への桁上げがあっても無くても無視する,と いうことです。これはnビットの枠内だけで計算を行えば良い,ということです。 C:8 ビット整数表現の加減算で,結果が整数の表現範囲を超えるとは,どのようなことか分からない。 A:例えば 8 ビットだと,−128~+127 までが表現できる範囲になります。加減算の2つの数値が表現範囲に入って いても,結果がはみ出す可能性があります。例えば,70+70 の結果は 140 となって,範囲を超えてしまいます。 このため,実際の演算回路では結果が範囲を超えたこと(オーバーフローと呼ぶ)を検出する回路が付加されて います。オーバーフローを検出してソフト的に解決することもできます。 Q:2 進数で 2 などの無理数を表せますか? A:一般に関数の値は,近似になります。つまり,有限桁で打ち切ることになります。 Q:有限桁の 10 進数で表せる数値が 2 進数では表せない場合があるということは,有限桁の 2 進数で表せて 10 進数では表せ ない数値があるということでしょうか? A:小数点を持つ有限桁の 2 進数は,有限桁の 10 進数で表せると思いますが,証明を考えてみます。 (Very Good) 「計算機基礎,計算機と情報社会・情報倫理」講義メモ 4-14
© Copyright 2024 Paperzz