Oracle SQL 関数 : BITAND,BITOR,BITXOR : ビット演算
numberRet := BITAND( numberSrc1, numberSrc2 ); BITAND 関数は numberSrc1, numberSrc2 の数値をビット毎に AND 処理した値を返します。 numberSrc1, numberSrc2 のどちらかが NULL の場合は NULL を返します。
以下に BITAND 関数の例を示します。
SQL> SET NULL /NULL/ SQL> SELECT 2 BITAND( BIN_TO_NUM(0,1), BIN_TO_NUM(0,0) ) AS "01 AND 00" 3 ,BITAND( BIN_TO_NUM(0,1), BIN_TO_NUM(0,1) ) AS "01 AND 01" 4 ,BITAND( BIN_TO_NUM(0,1), BIN_TO_NUM(1,1) ) AS "01 AND 11" 5 ,BITAND( BIN_TO_NUM(1,1), BIN_TO_NUM(1,0) ) AS "11 AND 10" 6 ,BITAND( BIN_TO_NUM(1,1), NULL ) AS "11 AND NULL" 7 FROM DUAL; 01 AND 00 01 AND 01 01 AND 11 11 AND 10 11 AND NULL ---------- ---------- ---------- ---------- ----------- 0 1 1 2 /NULL/
標準関数には BITOR , BITXOR 関数は存在しません。
そこで UTL_RAW パッケージを利用することで疑似的に BITAND 関数の様な処理ができます。
以下に UTL_RAW パッケージの BIT_OR 関数を利用する例を示します。
SQL> SELECT 2 UTL_RAW.CAST_TO_BINARY_INTEGER( 3 UTL_RAW.BIT_OR(UTL_RAW.CAST_FROM_BINARY_INTEGER(1), UTL_RAW.CAST_FROM_BINARY_INTEGER(0))) AS "01 OR 00" 4 ,UTL_RAW.CAST_TO_BINARY_INTEGER( 5 UTL_RAW.BIT_OR(UTL_RAW.CAST_FROM_BINARY_INTEGER(1), UTL_RAW.CAST_FROM_BINARY_INTEGER(1))) AS "01 OR 01" 6 ,UTL_RAW.CAST_TO_BINARY_INTEGER( 7 UTL_RAW.BIT_OR(UTL_RAW.CAST_FROM_BINARY_INTEGER(1), UTL_RAW.CAST_FROM_BINARY_INTEGER(3))) AS "01 OR 11" 8 ,UTL_RAW.CAST_TO_BINARY_INTEGER( 9 UTL_RAW.BIT_OR(UTL_RAW.CAST_FROM_BINARY_INTEGER(3), UTL_RAW.CAST_FROM_BINARY_INTEGER(2))) AS "11 OR 10" 10 ,UTL_RAW.CAST_TO_BINARY_INTEGER( 11 UTL_RAW.BIT_OR(UTL_RAW.CAST_FROM_BINARY_INTEGER(3), UTL_RAW.CAST_FROM_BINARY_INTEGER(3))) AS "11 OR 11" 12 FROM DUAL; 01 OR 00 01 OR 01 01 OR 11 11 OR 10 11 OR 11 ---------- ---------- ---------- ---------- ---------- 1 1 3 3 3
上の例のビットの OR 処理を行う UTL_RAW.BIT_OR 関数は2個の RAWデータ型 データが引数です。
そのため UTL_RAW.CAST_FROM_BINARY_INTEGER 関数で、数値を UTL_RAW パッケージで扱うデータ型である
RAWデータ型 に変換します。
以下に BIT_XOR 関数を利用する例を示します。
SQL> SELECT 2 UTL_RAW.CAST_TO_BINARY_INTEGER( 3 UTL_RAW.BIT_XOR(UTL_RAW.CAST_FROM_BINARY_INTEGER(1), UTL_RAW.CAST_FROM_BINARY_INTEGER(0))) AS "01 XOR 00" 4 ,UTL_RAW.CAST_TO_BINARY_INTEGER( 5 UTL_RAW.BIT_XOR(UTL_RAW.CAST_FROM_BINARY_INTEGER(1), UTL_RAW.CAST_FROM_BINARY_INTEGER(1))) AS "01 XOR 01" 6 ,UTL_RAW.CAST_TO_BINARY_INTEGER( 7 UTL_RAW.BIT_XOR(UTL_RAW.CAST_FROM_BINARY_INTEGER(1), UTL_RAW.CAST_FROM_BINARY_INTEGER(3))) AS "01 XOR 11" 8 ,UTL_RAW.CAST_TO_BINARY_INTEGER( 9 UTL_RAW.BIT_XOR(UTL_RAW.CAST_FROM_BINARY_INTEGER(3), UTL_RAW.CAST_FROM_BINARY_INTEGER(2))) AS "11 XOR 10" 10 ,UTL_RAW.CAST_TO_BINARY_INTEGER( 11 UTL_RAW.BIT_XOR(UTL_RAW.CAST_FROM_BINARY_INTEGER(3), UTL_RAW.CAST_FROM_BINARY_INTEGER(3))) AS "11 XOR 11" 12 FROM DUAL; 01 XOR 00 01 XOR 01 01 XOR 11 11 XOR 10 11 XOR 11 ---------- ---------- ---------- ---------- ---------- 1 0 2 1 0
UTL_RAW.BIT_OR 関数及び UTL_RAW.BIT_XOR 関数を利用して BITAND 関数の様な
BITOR BITXOR を宣言してみます。
SQL> CREATE OR REPLACE FUNCTION BITOR ( 2 InNum1 IN NUMBER 3 ,InNum2 IN NUMBER 4 ) 5 RETURN NUMBER 6 IS 7 WK1 RAW(16); 8 WK2 RAW(16); 9 BEGIN 10 WK1 := UTL_RAW.CAST_FROM_BINARY_INTEGER(InNum1); 11 WK2 := UTL_RAW.CAST_FROM_BINARY_INTEGER(InNum2); 12 RETURN UTL_RAW.CAST_TO_BINARY_INTEGER( UTL_RAW.BIT_OR(WK1, WK2) ); 13 END; 14 / ファンクションが作成されました。 SQL> SELECT 2 BITOR( BIN_TO_NUM(0,1), BIN_TO_NUM(0,0) ) AS "01 OR 00" 3 ,BITOR( BIN_TO_NUM(0,1), BIN_TO_NUM(0,1) ) AS "01 OR 01" 4 ,BITOR( BIN_TO_NUM(0,1), BIN_TO_NUM(1,1) ) AS "01 OR 11" 5 ,BITOR( BIN_TO_NUM(1,1), BIN_TO_NUM(1,0) ) AS "11 OR 10" 6 ,BITOR( BIN_TO_NUM(1,1), BIN_TO_NUM(1,1) ) AS "11 OR 11" 7 FROM DUAL; 01 OR 00 01 OR 01 01 OR 11 11 OR 10 11 OR 11 ---------- ---------- ---------- ---------- ---------- 1 1 3 3 3
BITXOR 関数の宣言は以下の様になります。
SQL> CREATE OR REPLACE FUNCTION BITXOR ( 2 InNum1 IN NUMBER 3 ,InNum2 IN NUMBER 4 ) 5 RETURN NUMBER 6 IS 7 WK1 RAW(16); 8 WK2 RAW(16); 9 BEGIN 10 WK1 := UTL_RAW.CAST_FROM_BINARY_INTEGER(InNum1); 11 WK2 := UTL_RAW.CAST_FROM_BINARY_INTEGER(InNum2); 12 RETURN UTL_RAW.CAST_TO_BINARY_INTEGER( UTL_RAW.BIT_XOR(WK1, WK2) ); 13 END; 14 / ファンクションが作成されました。 SQL> SELECT 2 BITXOR( BIN_TO_NUM(0,1), BIN_TO_NUM(0,0) ) AS "01 XOR 00" 3 ,BITXOR( BIN_TO_NUM(0,1), BIN_TO_NUM(0,1) ) AS "01 XOR 01" 4 ,BITXOR( BIN_TO_NUM(0,1), BIN_TO_NUM(1,1) ) AS "01 XOR 11" 5 ,BITXOR( BIN_TO_NUM(1,1), BIN_TO_NUM(1,0) ) AS "11 XOR 10" 6 ,BITXOR( BIN_TO_NUM(1,1), BIN_TO_NUM(1,1) ) AS "11 XOR 11" 7 FROM DUAL; 01 XOR 00 01 XOR 01 01 XOR 11 11 XOR 10 11 XOR 11 ---------- ---------- ---------- ---------- ---------- 1 0 2 1 0