おりにゃんのふぃーりん☆ぷろぐらみん!

プログラミング(主にC言語)の基礎的な事を脳を溶かしたレベルの語彙力で綴っていきます。

しーげんごをはじめてくそのまえに…そのに

はじめに

前回は、プログラムの大まかな流れについて説明しました。
今回は、「n進法」について簡単に説明したいと思います。

noy-orina.hatenablog.jp

ふだんからつかってる「えぬしんほー」

いきなり「n進法」といわれて、「何ぞ?」ってい思う人は少なからずいると思います。
でも、普段から誰でも「10進法」「60進法」は使っています。
普段使っている数で、桁が上がるのはいくつですか?
そう、「10」ですよね。それ以外のサポートは今はしかねます
この「桁が上がる瞬間」が「n進法」の「n」にあたります。つまり、私たちが普段使っているのは「10進法」というわです。
では、次の「60進法」はどうでしょう?何か思い当たることはありませんか?60で桁が上がるもの…

……
………
…………
分かりましたか?
答えは「時間」です。
60秒で1分、60分で1時間、という感じで60を境に上がっていますね。
そう、私たちはわけのわからん概念を詳細もわからないままいとも簡単に使いこなしているわけです。
いろんな意味ですっげぇな(語彙力)

でも、こんぴゅーたには…

しかしこの10進数や60進数、コンピュータで扱うにはちょっと大変なんです。
私たち人間には、五体満足であれば手に指が左右合わせて10本あります。
1本ずつ指を立てていけば、0から10まで数えることができます。
人間は手計算する際、そこまで難しい計算をしないので、10本あれば大体事足ります。
しかし、コンピュータにはもっと難しい計算をしてもらいたいですよね。0から10しか使えないコンピュータなんて存在意義(((ry

しょしんにかえって

より大きな計算をするためにはどうすればいいのか?そこでコンピュータはあえて2進数を使うことにしました。
「なんでや!それだと扱える数減るやろ!」って思ったかもしれませんが、実は2進数の特性のおかげで、10進数よりも多くの数を少ないメモリで扱えるのです。

にしんすーのとくちょー?

2進数は、「1本の指で表現できるすべてのパターンを表現できる」特性があります。
「そんなん当たり前やん?」って思った方、いますよね?指を伸ばす(1)か伸ばさない(0)かの2通りですもんね。
では、そんな2進数を使う指を2本に増やしてみましょう。
1本目は「1の次は0」、2本目は「1本目が1から0になったら1にする」というルールを追加します。
そうすると、次のように変化します。

00→10→01→11

お気づきでしょうか?この2桁の数字で表現できるものが全部出ています。
そりゃまあ当たり前ですよね、そういう「ルール」を作ったんですもの。
これにさらに1つ指を追加しましょう。2本目に1本目と同じルールを追加し、3本目はは「2本目が1から0になったら1にする」というルールにします。
そうすると、

000→100→010→110→001→101→011→111

これで、8パターンが表現できました。2本の時と比べると、実に倍のパターンを表現できることになります。
2本の時は1本の時と比べると倍のパターンを表現できているので、このまま指の数を増やしていくと、1本ずつ指を増やしていく毎に
16→32→64→128→256→…
と増えていきそうですね。
こうすれば、10進数の時よりも少ない指で多くの数が使えそうです。
これが、2進数の強みなのです。すっげぇな(語彙力喪失今回二度目)

でもけっきょくよむのは…

そう、でも結局プログラムを書くのも読むのも人間です。正直いって2進数でプログラム読み書きするのめんどいです。
1000表示させるのも9桁要りますからね。どうして9桁かって?計算すればわかる
しかし、2進数を10進数に直すのって、意外とめんどいんです。
「こいつさっきからめんどいしかいってねぇな…」って思ったそこのあなた、実際めんどいんですよこれ。
なので、変換しやすい進数を使いましょうということで出てきたのが「16進数」です。

じゅーろくしんすー!

さっきから出てきている2進法、桁上がりするときの特徴があるんですが、なにかわかりますか?

……
………
…………
はい時間切れー。わかった人は答え合わせ、分からなかった人はざまぁ今から説明していきます。

2進数は、「2のn乗」で桁上がりしています。
n乗って何ぞ?っていう人は、「累乗」でggってください。
そりゃまぁ10進数も10のn乗の時に桁上がりしているわけですから、そこはなんら問題ないでしょう。
そして、さっき使うと言った「16進数」の16。これ、2の4乗っていうのはお気づきでしょうか?
16で桁上がりする、ということは、2進数では4桁から5桁に桁上がりする瞬間になります。
つまり、16進数というのは、「2進数を4桁集めたまとまり」になるのです。

すうじがあるふぁべっと!?

2進数や10進数では、0~9の10個の数字だけで表現できますが、16進数となるとそれだけじゃ足りません。
なので、0~9の数字にさらに文字を追加して、それを10進数でいう10~15にあてていきます。
そこで出てくるのがa,b,c,d,e,fの6つのアルファベットです。
なんでアルファベットなのかはわかりませんが、んまぁ世界的に結構使われてる文字だから、くらいのノリでいいと思います。別になんの文字かは全く重要ではないので
アルファベットの順番通りにaを10、bを11、…としていき、0から15を表現すると、
0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
となります。最初はちょっと気持ち悪いかもしれませんが、じきに慣れます。てか慣れろ?
そんでもって10進数と見間違えないように、16進数の時は数字の前に0xとつけましょう。
カッコの中に数字を書いて、カッコの外の右下に何進数かを書くことでも判断できますが、ここはC言語っぽくいきます。
0xの書き方なら、C言語でもそのまま使えるので、記憶の片隅にでもしまっておいてください。
ちなみに2進数なら「0b」で表現できます。

おわりに

今回は、「n進数」について説明していきました。ちょっと難しい概念なので、これは使って慣れていくしかないです。
極論言えばプログラミングなんてほとんど慣れの世界なんですけどね…
ついでに言うと、この概念はプログラミングを「言われたとおりに書く」だけならほとんどお目にかかることはないです。
でも、たまーにエラーコードとかで見かけたりするので、覚えておいて損はないです。
「数字とアルファベットの羅列だー!」って混乱することも減ると思います。

そろそろ次回あたりから、プログラミングに入っていこうかなーと思います。
「ほぼ1年かけて数記事しか書いていないとは何事だ」とか思わないでください普通に忙しいんです(白目)
そんなわけで相変わらず超不定期更新ですが、気長に待っていただければと思います。