突然ですが、基本情報技術者試験を受けようかと思ってます。
正直、Pythonのモジュールを使えば、あまり難しいこと考えずに色々できてしまいますが、「なんでそうなのか?どういう原理なのか?」ってちゃんと理解したい。
というのが動機です。
そこで、自分が勉強した内容をPythonでコードで表現してみて、理解を深め、その内容を記事にも書いていこうと思いました。
需要の有無は不明ですが・・・(笑)
んなこと知ってるわって方も多数だと思うので、生暖かい目でそっとしていただけると幸いです。
コンピューターは2進数(1か0)で、動いています。
1か0だけだと、できることは限られそうですが、これを組み合わせることで表現しているわけです。
僕たちが普段目にしているのは10進数です。
1桁に0~9までの数字があり、10となると1桁繰り上がります。
2進数は、1桁に0~1までの数字のみとなっていて、2になると1桁繰り上がるわけです。
例えば、128という10進数について、考えてみましょう。
2進数の1・0で表せるのが、コンピュータにおける最小単位となり、これを「1ビット」と言います。
ちなみに、「1バイト」で「1バイト=8ビット」となっています。
なぜ1バイトが8ビットかというと、半角英数字は8ビットで表現できるためです。
例えば、大文字のAは’01000001’、小文字のaは’01100001’となります。
ちなみに1バイト(8ビット)の最大値は「11111111」となります。
これは、2の7乗+2の6乗+2の5乗+2の4乗+2の3乗+2の2乗+2の1乗+2の0乗となり、255となります。'00000000'も含めると、256通り表現できるため25文字しかないアルファベットであれば大文字・小文字・記号・数字(0~9)等を含めても表現可能なわけです。
(日本語の場合は、文字数が多いため「2バイト=16ビット」が必要となります。
2進数で1文字を表そうとすると、8ビットも必要になります。
例えば、8進数だと0~7を1桁で表します。16進数の場合は10以上の数はアルファベットA~Fとし、1桁で0~15を表します。
分かりづらいので、図で示すと・・・
ちなみに、昔のコンピューターは3の倍数ビット(12ビットや24ビット)だったので、
3ビット毎にまとめられる8進数は丁度良かったとのこと。
なお、現在は4の倍数ビット(32ビットや64ビット)のコンピューターが主流なので、4ビット毎にまとめられる16進数が便利な訳です。これも図にすると・・・
こういうことですね!
ちなみに余談ですが、1KBは1,000B(正確に言うと1,024バイト(8,192ビット))
1MBは1,000KB(正確に言うと1,024キロバイト(1,048,576バイト))となってます。
何で実際1,024バイトや1,048,576かというと、上の話同様コンピューターは2進数ベースなので、2の10乗が1,024、2の20乗が1,048,576だからなんですね。
やっと本題です。
どうも書き始めると気分が乗って長くなってしまう・・・。
まずは10進数から2進数を求める関数を作ってみます。
先ほどから見てきた通り、1桁左に行くにつれて2の階乗数が増えます。
逆を言うと、2で1か0になるまで割っていき、余りがあれば1を、なければ0を置いけば2進数はできあがります。
こういうことです。
念のため、検証してみましょう。
合ってますね。
これでもう分かった方もいると思いますが、商が1か0になるまで、商に対して割り残をしながら、余り1もしくは0を拾っていけばいいことになるわけです。
プログラムは以下のとおりです。
引数に10進数(変数n10)をとって、2で割った商をn10に代入しながら、余り1もしくは0をn2_listに格納していきます。
(商が1となった場合はそこで打ち切り、リストに最後に1を加えます。)
図5の通り、下から上に並べる必要があるので、リストをreverse関数で逆順に並び替えして、join関数を使って文字列にしてresult変数に格納し、返り値を出力しています。
上記関数が記載されたファイルを、コマンドプロンプトで呼び出し適当な10進数を引数として実行すると、2進数で出力がされます。
無事出力されました。
おまけで、8進数と16進数のコードも書いたので載せておきます。
8進数は2進数とあまり変わりませんが、16進数の場合は15までの数を定義する必要があるのでn16_numというリストを用意し、何番目の要素かを指定するように作りました。
↓10進数を8進数に変換するコード
↓10進数を16進数に変換するコード
実行の仕方は同じです。
最後まで読んでいただき大変ありがとうございました!