基本情報技術者試験 No.001
基本情報技術者試験の秋期試験を受けようと思っています。
昨年から受けようと思っていたのですが、なかなか読み進めることができなくて。
kindleの本もずっと積読状態でした。という訳でさっそくはじめます。
2進数からです。
10進数 | 2進数 |
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
11 | 1011 |
12 | 1100 |
という風に10進数での3は、2進数では11です。読み方は、10は「いちぜろ」、1101は「いちいちぜろいち」です。
2進数の1桁を「ビット(bit)」といいます。binary digitの略語です。
2進数の8桁を「バイト(byte)」といいます。
ですから、8bit = 1 byteとなります。
10111001 | 8桁 | 8ビット | 1バイト |
1001011110110100 | 16桁 | 16ビット | 2バイト |
10010101101010000111010101010100 | 32桁 | 32ビット | 3バイト |
コンピュータ内部では、情報を2進数の数値で表します。通常、数値でない情報を数値に置き換えて表したものを「符号」、「コード(code)」といいます。
1ビットで表せるのは0か1の2通り、2ビットで表せるのは00、01、10、11の4通りです。nビットなら、2^{n}通りです(普段ならTeXを使いますが省略)。
1ビット | 0, 1 | 2通り |
2ビット | 00, 01, 10, 11 | 4通り |
3ビット | 000 ~ 111 | 8通り |
4ビット | 0000 ~ 1111 | 16通り |
5ビット | 00000 ~ 11111 | 32通り |
・・・ | ・・・ | ・・・ |
8ビット(1バイト) | 00000000 ~ 11111111 | 256通り |
8ビット(1バイト)では、256通りの符合が表すことができ、半角英数字や半角カナを表すのにちょうどいいのです。1バイトを半角1記号に割り当てる文字コードが多いです。
コンピュータ内部ではデータを格納する箱のサイズがあらかじめ決められています。小さな情報が大きい箱に割り当てられると、上位桁が0で埋められます。
たとえば、8ビットの箱に、2ビットのデータを入れるとこうなります。
0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
たとえ、2ビットのデータでも4ビットの箱を使うのであれば、0000、0001、0010、0011という風に表します。
大きな数と小さな数を表すときには単位を変えます。
K(キロ) | 10^{3} |
M(メガ) | 10^{6} |
G(ギガ) | 10^{9} |
T(テラ) | 10^{12} |
m(キロ) | 10^{-3} |
μ(マイクロ) | 10^{-6} |
n(ナノ) | 10^{-9} |
p(ピコ) | 10^{-12} |
2進数の代用表現として16進数と8進数が使用されます。たとえば、2進数での010010110110は、16進数では4B6で、8進数では2266です。
10進数を2進数に変換するように変換を行うことを「基数変換」といいます。基数とは基準になる数のことです。
たとえば、10進数で123を2進数に基数変換する場合、このように変換する基数(この場合2)で割り、その商を再度基数で割り、それを繰り返して割れなくなったとき、その余りを逆から並べると基数変換した値が求まります。
123÷2=商61 | 余り1 |
61÷2=商30 | 余り1 |
30÷2=商15 | 余り0 |
15÷2=商7 | 余り1 |
7÷2=商3 | 余り1 |
3÷2=商1 | 余り1 |
1÷2=商0 | 余り1 |
10進数の123を2進数に基数変換すれば、1111011となります。
次に、2進数の111011を10進数に基数変換する場合は、2進数の各桁とそれに対応する重みを掛けて、それを足し合わせて求めます。重みは、1桁目は1、2桁目は2、3桁目は4、4桁目は8という風に、2進数の1、10、100、1000に対応した数値になります。
64 | 32 | 16 | 8 | 4 | 2 | 1 | ・・・ | 桁の重み |
× | × | × | × | × | × | × | ||
1 | 1 | 1 | 1 | 0 | 1 | 1 | ・・・ | 2進数の桁の数 |
= | = | = | = | = | = | = | ||
64 | 32 | 16 | 8 | 0 | 2 | 1 | = | 123 |
最後の数を足し合わせて、64+32+16+8+2+1=123となります。
(64*1)+(32*1)+(16*1)+(8*1)+(4*0)+(2*1)+(1*1)という訳です。
そもそも、123という10進数を10進数に変換すると、(100*1)+(10*2)+(1*1)という風に桁の重みを掛けると求めることができるのと同様です。
16進数は、1から15までを1桁で表します。したがって、1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10...と数えます。Aは10、Fは15のことです。
8進数は、1,2,3,4,5,6,7,10と数えます。
16進数と8進数は2進数の代用表現として使用されます。16進数の1桁が2進数の4桁に対応するからです。扱える情報が16とおりで一緒になります。
2進数 | 16進数 | 2進数 | 16進数 |
0000 | 0 | 1000 | 8 |
0001 | 1 | 1001 | 9 |
0010 | 2 | 1010 | A |
0011 | 3 | 1011 | B |
0100 | 4 | 1100 | C |
0101 | 5 | 1101 | D |
0110 | 6 | 1110 | E |
0111 | 7 | 1111 | F |
2進数と8進数の場合、2進数の3桁と8進数の1桁が対応します。扱える情報は8で一緒です。
2進数 | 8進数 |
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
2進数を16進数に変換するには、下位の桁を4つずつ区切って、16進数に変換する方法があります。これまでと同様に重みづけをしていきます。
たとえば、01101100という2進数を16進数に変換する場合、
0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | ・・・ | 4桁ずつ区切る |
× | × | × | × | × | × | × | × | ||
8 | 4 | 2 | 1 | 8 | 4 | 2 | 1 | ・・・ | 2進数の桁の重み |
= | = | = | = | = | = | = | = | ||
0 | 4 | 2 | 0 | 8 | 4 | 0 | 0 | = | 足し合わせる |
最初の4+2=6、8+4=12=Cですので、2進数の01101100は16進数では6Cとなります。 同様に、2進数を8進数に変換する場合、2進数を3桁で区切って重みづけを行います。11011011という2進数を8進数に変換してみます。
1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | ・・・ | 3桁ずつ区切る |
× | × | × | × | × | × | × | × | × | ||
4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | ・・・ | 2進数の桁の重み |
= | = | = | = | = | = | = | = | = | ||
4 | 2 | 0 | 4 | 2 | 1 | 0 | 2 | 1 | = | 足し合わせる |
4+2=6, 4+2+1=7, 2+1=3ですから、8進数に変換すると673となります。
反対に、16進数を2進数に変換する場合、さっきと逆に16進数の各桁を4桁の2進数に分けて考えます。
先ほどの例でいえば、6Cという16進数は、6とCに分けて、2進数の各重み1,2,4,8をどのように組み合わせれば、6とCを作れるか考えるとわかります。
6なら2と4で、Cは12のことですので、8と4だと分かります。したがって、2と4は0110、8と4は1100ですから、01101100と2進数に変換できます。
次に、8進数を2進数に変換する場合は、16進数と考え方は一緒です。8進数の場合は上位の桁から3桁ずつに区切ります。先ほどの、673の場合は、2進数の各重みの1,2,4の組み合わせで考えると、6は2+4、7は1+2+4、3は1+2ですから、110、111、011を合わせて、110111011という2進数に変換されます。
8ビットの2進数で表せる情報は、00000000~11111111までの256通りです。これを10進数に変換すると、256通りの0以上のプラスの整数になります。これを符号なし整数と言います。
正負に分けたい場合は、256をプラス128通り、マイナス128通りの2通りに分けます。これを符号あり整数と言います。
符号あり整数の場合、最上位ビットが0ならプラス、1ならマイナスを表します。
0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
上がプラスで、下がマイナスです。上の例でいえば、00000000~011111111がプラスで、11111111~10000000がマイナスを表します。
符号あり整数でマイナスを表現する方法に、2の補数表現があります。8ビットで111111に00000001を足すと、本来10000000(9ビット)になりますが、データの入れ物の大きさが8ビットに決まっている場合、00000000になります。00000001(1)を足して00000000(0)になるから、11111111は-1とみなすことができます。
つまり、足すと0になる数を求めて、それをマイナスと表現します。00000100は-4です。
小数点は.(ドット)を使わずに、0と1だけで表現します。固定小数点形式はあらかじめ、小数点を入れる位置を決めておくもので、たとえば、01011011を0101.1011と小数点とみなします。
小数点の2進数を10進数になおす場合は、各桁に重みづけをして集計する方法で変わりありません。0.1、0.01、0.001は、10^{-1}、10^{-2}、10^{-3}で重みづけをするように、2進数の場合は、2^{-1}、2^{-2}、2^{-3}、つまり、0.5、0.25、0.125、0.0625と重みづけをします。たとえば、0101.1010の場合、整数は4+1=5、小数点は0.5+0.125=0.625で、5.625となります。