FE試験過去問にこんな問題があり、頭で考えるより実際に作ってみようかと思ってExcelVBAで作成してみた。
Dim j,k As Long
Dim A(8) As Variant
j = 10
Debug.print j
For k = 1 To 8
A(k) = j mod 2
j = j ¥ 2
Next
Debug.print A(8); A(7); A(6); A(5); A(4); A(3); A(2); A(1);
これで動かすとイミディエイトウィンドウに10進数での表記と2進数での表記が出力される。
最初に"Debug.print j" で10進数の状態を出力する。
変数kは、配列Aの要素番号(要素番号という言い方?)で、8桁分必要なので8までにする。
数が大きいほうが、2進数になったときに左側に来るというのがちょっとややこしい。
配列を普通に考えると、[1][2][3][4][5][6][7][8]と並ぶので。配列の要素に何を入れるのか、という処理は普通に1→8でやっていくんだけど、最後の出力の時に8→1で並べ直して出力すれば見た目は問題なくなる。
(…問題では配列はNISHINとなってるけど完全にお魚を想起するのでAに変更した。)
で、実際に配列に何を入れるのかが、問題で問われているところだけど、
10進数から2進数にする時に、どういう計算を行うか、という事が分かってなきゃいけない。
私の頭の中では当初、右から1桁目は1か0、2桁目は2か0、3桁目は4か0だから…みたいな小さい数にしか対応できねーよという考え方をしていた。
これはあんまり良くない。
教科書的なやり方を忘れてしまったからです。
で、教科書的なやり方はというと、10進数の値を2で割った余りを使う。と。
これが j mod 2 なんですが。
j=10としてるので、10で考える。
2進数にした時の一番右の桁(配列Aの[1]の要素)
10÷2=5...0
10を2で割った時の余り⇨0が入る
で、プログラムに戻るとこの次の操作は"j = j ¥ 2"なので
次のjは10(今のj)÷2の商を整数で取り出す。演算子で¥を使うと割り算の商を整数で持ってくれるそう。最初プログラム書いてる時に"/"を使っていて計算が上手くいかなくて調べた。
で、j = 10 ¥ 2 なので、次のjは5になる。
配列Aの[2]の要素
今j=5なので、" j mod 2 "は,5 mod 2で5を2で割った余りを求める事になる。
5÷2=2...1
なので、A[2]には1が格納される。
というの操作を8回やる。
[1]10/2=5...0
[2] 5/2=2...1
[3] 2/2=1...0
[4] 1/2=0...1
[5] 0/2=0...0
[6][7][8]は[5]と同じ。
配列Aには{0,1,0,1,0,0,0,0}が格納されて、2つ目のdebug.Printでは要素を逆に出力するので、"00001010"が出てくる。
これで問題は解ける。
んでんで、ここから不思議に思ったこと。
なんで、10進数から2進数に変換する時、(これは基数変換という)
元の値を2で割った余りを後ろから並べると2進数になるんだろうか。
2進数の在り方?から考えたら、5も6もないから、0,1,2,4,8,の中の組み合わせで10を作るとしたら、10は8+2でしか作れないので、2^3+2^1で1010になるのはわかるんだけど、それと2で割った余りってどんな関係があるの?って気になる。
考えたこと。
元の値を2で割った余りが0になるか1になるかというのは、元の値が奇数か偶数かという判定ができる。
2進数表記において、奇数を表現するときは絶対に一番右の桁(元の値>0の時)が1になる。
だから元の値を2で割って一番右の桁が0なのか1なのかを求める。
2進数は、基数が2で、その指数が0から順に並んでる。(プラス方向にもマイナス方向にも並んでるけど今はプラス方向のことだけ考えます)
今想定している2進数の並びは
2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0
2の0乗は1なので(このことは今度考える。)、1桁目の0 or 1っていうのはとてもわかりやすい。0でいいのか(偶数か)、1が必要なのか(奇数か)ということ。
じゃあ2桁目は何を求めてるの?っていう。
しかも2桁目はなぜか!10で2で割った時の商をさらに2で割るという操作をする。
なんで?
5÷2=2...1と、2^1の関係、なに?
5の中身について考えてみると、
5=1+1+1+1+1
=2^0+2^0+2^0+2^0+2^0
とか
5=1+2+2
=2^0+2^1+2^1
とか
5=1+4
=2^0+2^2
にできる。
10に戻ると、
10=2^0+2^0+2^0+2^0+2^0+2^0+2^0+2^0+2^0+2^0
=2^1+2^1+2^1+2^1+2^1
=2^2+2^2+2^1
=2^3+2^1
とかになる。
2^0は10個もあってこれを並べるわけにはいかないなあ。
2^1も5個ある。5だって。5が出てきた。10÷2=5って2^1が5個あるってことなのかな?
ちょっと整理すると10の中には
2^0⇨10個ある
2^1⇨5個ある
2^2⇨2個ある(2^1もある)
2^3⇨1個ある(2^1もある)
これって
[1]10/2=5...0
[2] 5/2=2...1
[3] 2/2=1...0
[4] 1/2=0...1
[5] 0/2=0...0
これと形が似ている気がする。
もっと整理する。
(1)10/2^0=10...0
(2)10/2^1=5...0
(3)10/2^2=2...2
(4)10/2^3=1...2
(5)10/2^4=0...0
10/5/2/1の流れが同じだ。
解決していない。
解決できないーーーーーーーー!