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