コンピュータ内部では、文字も数字も写真も音楽も全て1と0の2種類の数字に置き換えられて保存されている。1と0の2種類の情報であれば、スイッチのオン/オフや、磁極の向き、光の点滅で表現することが可能となる。我々が日常的に使用している10進数をコンピュータでそのまま取り扱うことを考えた場合、10種類の情報の表現方法を考えなければならず、装置の複雑化、大型化を招くことになる。
2進数は0と1の2種類の数字のみを使用するため、0の次は1、1の次は1桁繰り上がって10になる。以下に10進数との対応関係を示す。右側には16進数というのもある。2進数は2種類の数字のみで表現するために桁数が大きくなりやすい。コンピュータにとっては桁が多くても全く問題はないが、人間は読み間違いをする可能性がある。16進数は2進数を4桁ごとに区切って0000から1111を0からfに置き換えたものである。
2 進 数 | 10 進 数 | 16 進 数 |
0 | 0 | 0 |
1 | 1 | 1 |
10 | 2 | 2 |
11 | 3 | 3 |
100 | 4 | 4 |
101 | 5 | 5 |
110 | 6 | 6 |
111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | 10 | a |
1011 | 11 | b |
1100 | 12 | c |
1101 | 13 | d |
1110 | 14 | e |
1111 | 15 | f |
10000 | 16 | 10 |
Rubyでは、数値の先頭につける記号でその値が何進数であるかを指定する。
なお、何進数で指定をしても、一旦読み込まれれば全て内部では10進数で計算される。出力する際に何進数とするかは、printfの書式制御文字により指定可能である。
以下のプログラムは好きな数字の入力を求め、進数の変換を行うものである。emacsに貼り付けて保存をした後で(change.rb)、その下にある5つの数字を指定した進数に変換した結果をメールで送信する。ただし、このプログラムにはエラーがあり、このままでは上手く実行できない。エラーを修正した後で実行すること。
#!/usr/koeki/bin/ruby STDERR.print "好きな数字を入力してください" number = STDIN.gets.chomp! STDERR.print "何進数に変換しますか(1:2進数、2:10進数、3:16進数)" choice = STDIN.gets.chomp!.to_i if choice = 1 printf ("2進数だと%bです\n",number) elsif choice = 2 printf ("10進数だと%dです\n",number) elsif choice = 3 printf ("16進数だと%xです\n",number) else print "それは無理な相談ですね\n" end
制限時間は5分。出席点は2点。提出要領は下記の通り。
Tips:emacsでの日本語入力のオンオフはCtrl-oです
Tips:Mewによるメールの送り方はMewコマンドを参照
コンピュータ内では文字が1と0の組み合わせに置き換えられて保存されていることはすべに述べたが、この数字の配列と文字の対応表のことを文字コードという。
半角英数字は、0-9の数字、A-Zの大文字のアルファベット、a-zの小文字のアルファベット、?#$%@などの記号により構成されている。これだけの情報を1と0の組み合わせで表現するためにはある程度の桁数がなければならない。桁数と表現できる種類の関係は下記の通りである。
半角英数字は2進数8桁で表現されている(ただし先頭の1桁は使用していないので実際には7桁)。半角英数字の文字コードのことをASCIIコードという。一方、日本語は漢字が含まれるため8桁では表現できない。日本語を表現するためには1文字当たり16桁の2進数が用いられる。日本語の文字コードはJIS、Shift-JIS、EUCが用いられている。つまり、2進数と文字の対応表が3種類ある。時折文字化けで見られないWebページがあったり、emacsで作成したプログラムのうち日本語部分がおかしくなっている場合があったりする。これは文書やプログラムを作成したときの文字コードと表示をするときの文字コードが一致していないためである。UNIX環境ではEUCを用いる。
ASCIIコードの表は以下の通りとなる。ここでは16進数での文字コード表記となっている。2進数で表現しても良いが、桁数が多くなるため読み間違える可能性が生じる。
行方向(左側)が10の位、列方向(上側)が1の位になる。例えばAは41になる。Rubyでは16進数は0xをつけるのでAは0x41と表現できる。
0行と1行(0x00〜0x1F)は制御文字をあらわす。主に端末のコントロールをするもので代表的なものとして以下を挙げることができる。
制御文字の中にはキーボードから入力できないものがある。プログラムの中で制御文字を使用したい場合は文字コードで指定する。
%c:printfの書式制御文字の%cは、文字コードに対応する文字を出力する。
printf ("%c", 0x07)
とすると、文字コード0x07すなわちBELが出力され、端末のベルがなる(がスピーカーがついていないと音はならない)。
特定の文字の文字コードを知るためには?文字とする。例えばプログラム中で?Qとすれば、それはQの文字コード(0x51)を書いたのと同じことになる。さらに、これをprintfの制御文字である%x(16進数)で表示すれば、対応する文字コードが明らかになる。
しかし,この方法では1文字の文字コードを調べるのは簡単でも、文字列を構成する各文字の文字コードを調べるのはやや面倒である。文字列"Koeki"を構成する"K""o""e""k""i"の各文字の文字コードを調べることを考えてみよう。ここでは配列のときと同じように[]を利用すると簡単に取り出すことができる。
printf ("%x\n", "Koeki"[i])
上記のようにインデックスにiを使用し、初期値を0とした上で、whileの繰り返しの中でiの値を1ずつ変更していけば構成する文字の文字コードを全て明らかにすることができる。もちろん下記のように文字列を変数に代入しても同じことである。これによりキーボードから入力した任意の文字列を構成する文字の文字コードを調べることができる。
a = "Koeki"
printf ("%x\n", a[i])
以下の5問を実施する。
問1から問4の計算過程のうち例えば、10進数を2進数に変換する場合の計算過程は以下のように書くことができる。
2) 100 0 ---- 2) 50 0 ---- 2) 25 1 ---- 2) 12 0 ---- 2) 6 0 ---- 2) 3 1 ---- 1
Tips:emacsでの日本語入力のオンオフはCtrl-oです
Tips:ktermでのプログラムの実行結果をメールに貼り付けるには、コピーしたい箇所をマウスで選択し、emacs(Mew)上でマウスの真ん中ボタンをクリックする
Tips:Mewによるメールの送り方はMewコマンドを参照