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
演算が実行されます。