SQL

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

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

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を紹介したいと思います。

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

コメントを残す

*