10進数から2進数に変換する方法と、2進数から10進数に変換するサンプルを紹介します。
SQLでサクッと変換する標準関数が用意されていないようなので、PL/SQLで自作してみました。
10進数から2進数に変換するPL/SQLサンプル
FUNCTION作成
CREATE OR REPLACE FUNCTION DECTOBIN(
iNum IN NUMBER
) RETURN VARCHAR2
IS
oBinary VARCHAR2(8);
BEGIN
oBinary :=
TO_CHAR(MOD(TRUNC(iNum/128),2))
|| TO_CHAR(MOD(TRUNC(iNum/64),2))
|| TO_CHAR(MOD(TRUNC(iNum/32),2))
|| TO_CHAR(MOD(TRUNC(iNum/16),2))
|| TO_CHAR(MOD(TRUNC(iNum/8),2))
|| TO_CHAR(MOD(TRUNC(iNum/4),2))
|| TO_CHAR(MOD(TRUNC(iNum/2),2))
|| TO_CHAR(MOD(TRUNC(iNum/1),2))
;
RETURN oBinary;
END;
/
ファンクションが作成されました。
10進数「7」を2進数に変換
SELECT DECTOBIN(7) FROM DUAL; DECTOBIN(7) -------------------------------------- 00000111
10進数「255」を2進数に変換
SELECT DECTOBIN(255) FROM DUAL; DECTOBIN(255) -------------------------------------- 11111111
解説
10進数を2進数に変換するには0~9の数値を使わずに0と1だけを使って表現しなければなりません。2進数は桁が増える毎に2のX(桁)乗の重みが加わりますので、下記の様な計算式で2進数に変換することができます
1.変換対象数値を、128(2の8乗)で割って、さらに2で割った余りを求める
2.変換対象数値を、64(2の7乗)で割って、さらに2で割った余りを求める
3.変換対象数値を、32(2の6乗)で割って、さらに2で割った余りを求める
4.変換対象数値を、16(2の5乗)で割って、さらに2で割った余りを求める
5.変換対象数値を、8(2の4乗)で割って、さらに2で割った余りを求める
6.変換対象数値を、4(2の3乗)で割って、さらに2で割った余りを求める
7.変換対象数値を、2(2の2乗)で割って、さらに2で割った余りを求める
8.変換対象数値を、1(2の1乗)で割って、さらに2で割った余りを求める
9.上記1~8の結果を文字列結合させると10進数が2進数になる
2進数から10進数に変換するPL/SQLサンプル
FUNCTION作成
CREATE OR REPLACE FUNCTION BINTODEC(
iBinary IN VARCHAR2
) RETURN NUMBER
IS
oNumber NUMBER(3);
BEGIN
oNumber :=
(TO_NUMBER(SUBSTR(iBinary,1,1)) * 128)
+ (TO_NUMBER(SUBSTR(iBinary,2,1)) * 64)
+ (TO_NUMBER(SUBSTR(iBinary,3,1)) * 32)
+ (TO_NUMBER(SUBSTR(iBinary,4,1)) * 16)
+ (TO_NUMBER(SUBSTR(iBinary,5,1)) * 8)
+ (TO_NUMBER(SUBSTR(iBinary,6,1)) * 4)
+ (TO_NUMBER(SUBSTR(iBinary,7,1)) * 2)
+ (TO_NUMBER(SUBSTR(iBinary,8,1)) * 1)
;
RETURN oNumber;
END;
/
ファンクションが作成されました。
2進数「00000111」を10進数に変換
SELECT BINTODEC('00000111') FROM DUAL;
BINTODEC('00000111')
--------------------
7
2進数「11111111」を10進数に変換
SELECT BINTODEC('11111111') FROM DUAL;
BINTODEC('11111111')
--------------------
255
解説
2進数の各桁は0と1の数値を表現しています。そして、桁が増える毎に2のX(桁)乗の重みが加わりますので、下記の様な計算式で10進数に変換することができます
1.変換対象数値の8桁目を128(2の8乗)で掛けた値を求める
2.変換対象数値の7桁目を64(2の7乗)で掛けた値を求める
3.変換対象数値の6桁目を32(2の6乗)で掛けた値を求める
4.変換対象数値の5桁目を16(2の5乗)で掛けた値を求める
5.変換対象数値の4桁目を8(2の4乗)で掛けた値を求める
6.変換対象数値の3桁目を4(2の3乗)で掛けた値を求める
7.変換対象数値の2桁目を2(2の2乗)で掛けた値を求める
8.変換対象数値の1桁目を1(2の1乗)で掛けた値を求める
9.上記1~8の結果を全て足すと2進数が10進数になる
10進数から2進数は0~255まで、2進数から10進数は8桁までしか対応できていません。
次回はもう少し汎用的にしてサンプルPL/SQLを紹介したいと思います。