SQL

10進数と2進数の変換・2回目

  • このエントリーをはてなブックマークに追加

前回は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

以上です。

  • このエントリーをはてなブックマークに追加

コメントを残す

*