[PHP] 進数/進法の変換 (2進数、8進数、10進数、16進数)

PHP, 正規表現10進数, 16進数, 2進数, 8進数, math関数, 変換

PHPのMath関数に〇進数から〇進数に変換する関数があります。

今回はこれを利用して進数の変換ツールを作成します。

解説等はいいから変換したいという方はこちらのツールをご利用ください。

2進数、8進数、10進数、16進数のいずれかを入力すれば他の進数に変換します。

〇進数とは

漠然としていてよくわかりませんが、通常の生活では10進数を使用しています。

2進数はコンピューターで、16進数はCSSの色表記でよく見ますね。8進数はあまりピンときません。

詳細はWikiPediaページの位取り記数法でご確認ください。

関数

以下の関数がphp.netで確認できました。

  • decbin — 10 進数を 2 進数に変換する
  • bindec — 2 進数 を 10 進数に変換する
  • decoct — 10 進数を 8 進数に変換する
  • octdec — 8 進数を 10 進数に変換する
  • dechex — 10 進数を 16 進数に変換する
  • hexdec — 16 進数を 10 進数に変換する

decbin

10進数を進数に変換します。

decbin(10)

bindec

2 進数 を 10 進数に変換します。

bindec('01101')

パラメーターは文字列ではなくてはいけません。必ずコーテーションで囲んでください。

decoct

10 進数を 8 進数に変換します。

decoct(10)

octdec

8 進数を 10 進数に変換します。

octdec(15)

dechex

10 進数を 16 進数に変換します。

dechex(10)

hexdec

16 進数を 10 進数に変換します。

hexdec(FFFFFF)

すべての返り値は変換後の数値になります。

変換する

10進数→〇進数、〇進数→10進数への変換は関数を使えば問題ないが、2進数→8進数等10進数が絡まない変換については関数がありません。

下図のようなイメージです。

281016
2×bindec ×
8× octdec ×
10decbin decoct dechex
16 × × hexdec

ですので、2進数→8進数のような変換の場合、いったん10進数に変換します。

このようにします。

281016
2bindec -> decoct bindec bindec -> dechex
8octdec -> decbin octdec octdec -> dechex
10decbin decoct dechex
16hexdec -> decbin hexdec -> decoct hexdec

フォーム部分の作成

変換するために数値を入力するテキストボックスと進数のタイプを選択するラジオボタンのフォームを作成します。

<input type="text" name="num" size="20" required>
<label><input type="radio" name="type" value="10" checked="checked">10進数</label>
<label><input type="radio" name="type" value="2">2進数</label>
<label><input type="radio" name="type" value="8">8進数</label>
<label><input type="radio" name="type" value="16">16進数</label>

入力内容チェック

一応、入力された値が選択されたタイプとして有効な値であるかを正規表現を使用してチェック。

//2進数の場合
preg_match("/[0-1]+/", $num)

//8進数の場合
preg_match("/[0-7]+/", $num)

//10進数の場合
preg_match("/[0-9]+/", $num)

//16進数の場合
preg_match("/[0-9a-fA-F]+/", $num)

こんな感じですね。

2進数、8進数を入力して誤って10進数が選択された場合、チェックが通ってしまいますが、それは仕方ない。

変換実行

値に問題がなければ、変換実行!としたいですが、前述の通り2進数→8進数 の変換の場合、10進数に変換する必要があります。

ケースによって10進数に変換するプロセスを挿入するのも面倒なので、まずは10進数に変換します。

if ($type == 2) {
$num = "'".$n."'";
$n = bindec($q);
}
else if ($type  == 8) {
$n = octdec($n);
}
else if ($type == 10) {
$n = $n;
}
else if ($type == 16) {
$n = hexdec($n);
}

bindecのパラメーターは文字列でなくてはいけません。

よって、「$num = “‘”.$n.”‘”;」とパラメータをコーテーションで囲ってます。

変換した10進数の数字を使用して以下のように変換実施。

echo "2進数 - " .decbin($n). "<br />";
echo "8進数 - " .decoct($n). "<br />";
echo "10進数 - " .$n. "<br />";
echo "16進数 - " .dechex($n). "<br />";

以上です。