マツリさんの日記

androidプログラミング初心者の奮闘日記です。たまに統計学もしてます。

基本情報技術者試験 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ビットのデータを入れるとこうなります。

 たとえ、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となります。