zeroiti

C言語初心者学習記 part4

記数法をおさらい

難所ポインタにたどり着いたようです。

とりあえず、2進法や8進法、16進法などの記数法をおさらいしておくべきと思いました。

今回は、C言語というより数学寄りになりそう。

意外と、SPI対策講座にもなりそうw

10進法から見直そう

少なくとも、現代は10進法を根底に作られています。(実は民族によっては10進法ではない文化もありました)。

なので、その他の進数がこんがらがって感じますね。

そこで、先ず当たり前に感じる10進数から見直します。

 

10進数は言うまでもなく0~9の十種の数字で成り立っています

9に1を加えると位が上がって十の位が1に、一の位が0に戻りますね。

このように、10でひとまとまりにしているので、10の塊で分解できます

百の位は10が十個でひとまとまりに、

千の位は100が十個でひとまとまりにしています。

これを基に以下でわかりやすく分解してみます。

 


 

ex1)2015

=1000×2+100×0+10×1+5

=10³×2+10²×0+10¹×1+5


 

となりますね。

では、他の進数を考えてみます。

 

2進法

二進法は0と1の二種類の数字であらわせます

 

位取りも”2”進法なので、2でひとまとまりです。

又、この2進数の一桁をビット(b)とも言いますね。

 

そのため、先ほどと同じように2のχ乗で分解することができます。


 

ex2)1010

=×1+×0+×1+0 (これを解くと)

=10 (十進数に戻る)


 

逆に、10進数を2進法であらわしたいときは逆の操作をします。

かけてあげたので今度は割ります。

2進法は2の塊であらわしたいので2で割ります。


 

10÷2=5…0

5÷2=2…1

2÷2=10

このように余りを求めつつ因数分解します。

最後の解と出た余りを逆順にすると”1010”となりましたね。


 

 

何に利用されるの?

2進法は論理学や電気工学、情報工学等に応用されます。

0と1は「真か偽か」「電流が流れる・流れない」といった判別に利用されます。

好んでコンピュータに採用されたのは、十進法だと10種類の状態を処理しなくてはならず難しいためだそうです。

2進法と回路、論理に強くなれば、マイクラのレッドストーン回路とかの扱いもうまくなるかも…w

 

8進法

これも同じように処理できます。

8進法は0~7の8種類の数字であらわされているので、8で一塊で扱います。


 

ex3)164(8進法)

=×1+×6+4

=64+48+4

=116(十進法)

 

116÷8=14…4

14÷8=16

逆順にして164ですね。


 

 

では、8進数から2進数に変えたいときはどうするのでしょうか。

これは、10進数になおすよりも簡単です。

2進数は2のχ乗で分解できましたね。

なので、2³のときに8が出てきます。

よって、2進数3桁分で8進数1桁を表すことができます。

この事から、2進法なら3桁に区切って10進法であらわせばよさそうです。

以下で試してみましょう。


 

ex2-1)1010

3桁ごとに区切ります。1|010

010=2

1=1

よって8進法だと12となります。


 

ex3-1)164

逆に8進法から2進法の場合は、桁ごとに2進法3桁になおすだけです。

1=1

6=110

4=100

繋げて、1110100ですね。

もし111(8進法)のような場合、

1=1

1=1

1=1

となりますが、3桁分確保する必要があるので、1001001となります。


 

 

何に使うの?

散々書いといて何ですが、「昔は」使われていたようです。

2進法と親和性があって、数字であらわせる点でかつては使われていたところもあったようです。

いまだと、SPIとかこの手のテストで「8進法になおせ」とか言われる程度ですかねw

 

16進法

むしろこっちの方が現代では重宝されます。

いらないと思った方は8進法の事は忘れてくださいw

 

16進法は0~Fまでの数と数字で表します

15種類も数字は無いからです。

なので、A=10、B=11、C=12と解釈します。

しかし、要領はいままでと変わりません。

16のχ乗の塊で分解して考えます。


 

ex4)FF5

F=15と読み替えます。

=16²×15+16¹×15+5

=3840+240+5

=4085

となります。

10進法から戻す時も同様に、

4085÷16=255…5

255÷16=1515

15=Fなので、FF5となり戻せました。


 

 

次に、他の記数法に変換してみましょう。

16進法も2進法と親和性が高いです。

2進法なら4桁分で16進法1桁をあらわせます。

 


 

ex3-2)1110100

4桁ずつに区切ります。111|0100

111=7

0100=4

よって、16進法では74とあらわせれます


 

以下の様に直接変換できないものの場合、一度2進数にします。

ex3-3)164(8進法)

1=1

6=110

4=100

164=1110100

後に上述の操作をして

164(8進法)=1110100(2進法)=74(16進法)


 

16進法→2進法の場合も同じです。

ex4-1)FF5

各桁を2進数4桁になおします。

F=15=1111

F=15=1111

5=0101

よって、1111 1111 0101となります。


 

 

何に使うの?

以前紹介した文字コードや、色などに割り当てる値として利用されます。

そのほかにも、2進数との親和性から、大量の2進数を圧縮するためにも使われます。

 

まとめ

学校で学んだ~進法を見直しました。

とりあえず、2進法と16進法は把握しておかなくてはなりませんね。

 

【前→C言語初心者学習記 part3

【後→C言語初心者学習記 part5

0

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA