前回は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
以上です。