質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

1643閲覧

2進数を16進数に変換しない方法

aaaaaaaa

総合スコア501

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2016/08/12 11:04

下記のソースは、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);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

どうすれば16進数にならずに済むかを教えてください。

最初から文字列で与えれば、この関数で期待の結果が得られそうに思いますよ

php

1print henkan('0101');

###追記
既存の関数を使う場合でも文字列で二進数を渡します

php

1echo bindec('110011') . "\n"; //51

投稿2016/08/12 12:02

編集2016/08/12 12:26
hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaaaaaa

2016/08/16 08:36

ご回答有難うございました。数値を文字列にするだけで解決できるのですね。 勉強になりました。
guest

0

0101が65になるのは8進数です。
0x0101は257ですね。

phpではシェルスクリプトなどと同様に 先頭がゼロではじまる数値リテラルは8進数になります。

投稿2016/08/12 11:59

flied_onion

総合スコア2604

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaaaaaa

2016/08/16 08:35

ご回答有難うございます。0101という2進数を8進数或いは16進数に変換すると5になります。0101を10進数として扱ったとき、これを16進数にすると65になります。 8進数に変換すると65ではなく145になります。 8進数ではなく16進数だと思います。
Zuishin

2016/08/16 08:43

いやいや、henkan に渡されている 0101 が二進数ではなくて八進数だということでしょう。頭に 0 をつけると八進数として扱われます。二進数にしたいなら 0b0101 としなければなりません。 http://php.net/manual/ja/language.types.integer.php
aaaaaaaa

2016/08/16 08:52

ご回答有難うございます。申し訳ありません。誤解しておりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問