下記のソースは、henkan()に与えられた実引数の2進数を10進数に変換する関数です。
上一けたが、1以上であれば一応思い通りに動くのですが、0101のように上一けたが0だとhenkanに与えられた実引数を仮引数として
受け取った時点で16進数に変換されてしまうのです。つまり10進数にできないのです。
どうすれば、16進数に変換されずに済むのでしょうか。
bin2hexのように16進数にしてくれる関数があるので2進数を10進数にしてくれる内部関数があるかもしれませんが、今回は、
どうすれば16進数にならずに済むかを教えてください。
php
1function henkan($nisinsu) { 2 3 //どこで文字列型になったのか 4 print "どこで文字列型になったのか:".gettype($nisinsu)."(".$nisinsu.")";//まだ、henkan関数に引数として受け取られたころは、double(倍精度浮動小数点数)型だ。 5 6 //二進数を受け取ったら、数字を一つ一つ分解し、2^x乗の計算をする。 7 //マッチした部分を境に区切るのがpreg_splitなので数値と数値の間の"位置"にマッチするよう作る。 8 $result = preg_split("//", $nisinsu,-1,PREG_SPLIT_NO_EMPTY);//分割の結果、空になった配列だけを排除する定数。 9 10 //どこで文字列型になったのか 11 print "どこで文字列型になったのか2:".gettype($result[1])."<br>";//▼なぜ、preg_splitすると文字列型になるのだろうか。 12 13 //preg_splitによって分割された配列の数を取得 14 $kazu = count($result); 15 print "<p>配列の数".$kazu."</p>"; 16 17 //初期化式 条件式 増加式 18 //for文内の初期化式であるpow()は、第一引数が、基数、第二引数が指数。$resultにかけるべき指数を算出(int)。2の$kazu-1乗が$sinsuに代入される。$kazuは、preg_splitで分割された文字の数が代入されている。 19 //$kazuに「-1」しないと、例えば、2進数の四ケタ目(1010の1)に乗算される1/8が1/16になってしまう。 20 for($i=0,$sisuu = pow(2,$kazu-1);$kazu > $i;$i++){ 21 //for文の増加式にいれると計算してくれないのでここでする。$iが0のとき、つまりループ初回のときは、計算を行わない。 22 if($i !== 0) { 23 //2進数の一桁一けたに乗算するために必要な2の乗数の指数を算出。 24 $sisuu= $sisuu/2; 25 } 26 print "●resultに掛けるべき数".$sisuu."<br>"; 27 print"●result:".$result[$i]."<hr>"; 28 //zyusinsuという配列に2進数を10進数に換算するのに必要な値を格納。 29 $zyusinsu[] = $sisuu*$result[$i]; 30 } 31 //配列の数値を表示。 32 print_r($zyusinsu); 33 //配列の数値を加算。 34 //zyusinsu[0]+zyusinsu[1]+zyusinsu[2]+zyusinsu[3]+zyusinsu[4]... 35 //配列の数だけ、zyusinsu[0]に1番目以降の配列の値を加算させる。 36 //iが0だと、zyusinsu[0]にzyusinsu[0]を足してしまい、計算が合わなくなってしまう。 37 for($i=1;$i<count($zyusinsu);$i++) { 38 $zyusinsu[0] += $zyusinsu[$i]; 39 40 } 41 print "<hr>"; 42 return "<p>".$nisinsu."を十進数に変換すると…".$zyusinsu[0]."</p>"; 43} 44 45 46//ここでhenkanに0101を入れると16進数で変換されてしまう。0101の16進数は65だ。 47print henkan(0101);
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/16 08:36