前回は10進数から2進数に変換する方法と、2進数から10進数に変換するPL/SQLサンプルを紹介しました。
今回はもう少し汎用的なロジックにしたPL/SQLを紹介します。
ループ処理を使用して、POWERというOracleの標準関数を使用してべき乗を求めて、10進数⇔2進数変換を行っています。
10進数から2進数に変換するPL/SQLサンプル
FUNCTION作成
CREATE OR REPLACE FUNCTION DECTOBIN(
iNum IN NUMBER
) RETURN VARCHAR2
IS
i NUMBER(9);
oBinary VARCHAR2(500) := '';
BEGIN
i := 0;
-- 2のべき乗(i)がiNumを超えるまでループ
WHILE POWER(2,i) < iNum LOOP
-- 1桁ずつビットを求める
oBinary := TO_CHAR(MOD(TRUNC(iNum/POWER(2,i)),2)) || oBinary;
i := i + 1;
END LOOP;
RETURN oBinary;
END;
/
ファンクションが作成されました。
10進数「9」を2進数に変換
SELECT DECTOBIN(9) FROM DUAL; DECTOBIN(9) ------------------------- 1001
10進数「65535」を2進数に変換
SELECT DECTOBIN(65535) FROM DUAL; DECTOBIN(65535) ------------------------- 1111111111111111
2進数から10進数に変換するPL/SQLサンプル
FUNCTION作成
CREATE OR REPLACE FUNCTION BINTODEC(
iBinary IN VARCHAR2
) RETURN NUMBER
IS
i NUMBER(9);
oNumber NUMBER(9);
BEGIN
i := 0;
oNumber := 0;
-- iがiBinaryの桁数を超えるまでループ
WHILE i < LENGTH(iBinary) LOOP
-- 1桁ずつ10進数を計算
oNumber := oNumber + (TO_NUMBER(SUBSTR(iBinary,LENGTH(iBinary)-i,1)) * POWER(2,i));
i := i + 1;
END LOOP;
RETURN oNumber;
END;
/
ファンクションが作成されました。
2進数「1001」を10進数に変換
SELECT BINTODEC('1001') FROM DUAL;
BINTODEC('1001')
----------------
9
2進数「1111111111111111」を10進数に変換
SELECT BINTODEC('1111111111111111') FROM DUAL;
BINTODEC('1111111111111111')
----------------------------
65535
以上です。