BITAND
構文
目的
BITANDファンクションは、その入力と出力をビットのベクトルとして扱います。出力は、入力のビット単位ANDになります。
expr1およびexpr2の型はNUMBERであり、結果はNUMBER型になります。BITANDのいずれかの引数がNULLの場合、結果はNULLになります。
引数は、-(2(n-1)) .. ((2(n-1))-1)の範囲にする必要があります。引数をこの範囲外にすると、結果は未定義になります。
結果は、いくつかのステップで計算されます。まず、それぞれの引数Aが値SIGN(A)*FLOOR(ABS(A))に置き換えられます。この変換では、各引数の小数点以下が切り捨てられます。次に、整数値となったそれぞれの引数Aが、nビットの2の補数のバイナリ整数値に変換されます。ビット単位AND演算を使用して、2つのビット値が組み合せられます。最後に、生成されたnビットの2の補数値がNUMBERに変換されます。
BITANDファンクションのノート
-
BITANDの現行の実装では、n= 128が定義されています。 -
PL/SQLは、入力と結果の型がすべて
BINARY_INTEGERで、n= 32のBITANDのオーバーロードをサポートしています。
例
次の例では、数値6(バイナリ1,1,0)と数値3(バイナリ0,1,1)にAND演算を実行します。
SELECT BITAND(6,3)
FROM DUAL;
BITAND(6,3)
-----------
2
これは、6と3のバイナリの値を示す次の例と同じです。BITANDファンクションは、バイナリの値の有効桁のみで演算を実行します。
SELECT BITAND(
BIN_TO_NUM(1,1,0),
BIN_TO_NUM(0,1,1)) "Binary"
FROM DUAL;
Binary
----------
2
単一の列値における複数の値のエンコードの詳細は、「BIN_TO_NUM」の例を参照してください。
次の例では、サンプル表oe.ordersのorder_status列で複数の選択項目を1つの数値内の個別のビットとしてエンコードします。たとえば、まだ倉庫にある発注は、バイナリの値001(10進値1)で表されます。陸上輸送で発送される発注は、バイナリの値010(10進値2)で表されます。保険がかけられた荷物は、バイナリの値100(10進値4)で表されます。この例では、DECODEファンクションを使用して、order_status値の3つのビットのそれぞれに2つの値(ビットがオンの場合の値とビットがオフの場合の値)が示されています。
SELECT order_id, customer_id, order_status,
DECODE(BITAND(order_status, 1), 1, 'Warehouse', 'PostOffice') "Location",
DECODE(BITAND(order_status, 2), 2, 'Ground', 'Air') "Method",
DECODE(BITAND(order_status, 4), 4, 'Insured', 'Certified') "Receipt"
FROM orders
WHERE sales_rep_id = 160
ORDER BY order_id;
ORDER_ID CUSTOMER_ID ORDER_STATUS Location Method Receipt
---------- ----------- ------------ ---------- ------ ---------
2416 104 6 PostOffice Ground Insured
2419 107 3 Warehouse Ground Certified
2420 108 2 PostOffice Ground Certified
2423 145 3 Warehouse Ground Certified
2441 106 5 Warehouse Air Insured
2455 145 7 Warehouse Ground Insured
Location列では、まずBITANDによってorder_statusと1(バイナリ001)が比較されます。比較されるのは重要なビット値のみです。したがって、右端のビットが1であるバイナリの値(奇数)は正と評価され、1が戻されます。偶数の場合は0(ゼロ)が戻されます。DECODEファンクションでは、BITANDによって戻された値と1が比較されます。両方とも1の場合、場所はWarehouse(倉庫)になります。これらの値が異なる場合、場所はPostOffice(郵便局)になります。
Method列とReceipt列は、同様に計算されます。Methodでは、BITANDによってorder_statusと2(バイナリ010)にAND演算が実行されます。Receiptでは、BITANDによってorder_statusと4(バイナリ100)にAND演算が実行されます。
