본문 바로가기

[오라클 레퍼런스 함수] BITAND - 비트 AND 연산

by ㅇㅍㅍ 2023. 7. 31.
[오라클 레퍼런스 함수] BITAND - 비트 AND 연산
728x90

BITAND

 

구문

BITAND(expr1, expr2)

 

목적

BITAND 함수는 입력과 출력을 비트 벡터로 처리하며, 출력은 입력들의 비트 AND 연산 결과입니다.

expr1expr2의 데이터 타입은 NUMBER이며, 결과도 NUMBER 타입입니다. BITAND 함수의 어떤 인수라도 NULL이면 결과도 NULL이 됩니다.

인수들은 -(2(n-1))에서 ((2(n-1)))-1) 범위에 있어야 합니다. 만약 인수 중 하나라도 이 범위를 벗어난다면, 결과는 정의되지 않습니다.

결과는 여러 단계를 거쳐 계산됩니다. 먼저, 각 인수 A는 SIGN(A)*FLOOR(ABS(A)) 값으로 대체됩니다. 이 변환은 각 인수를 0으로 가까이 버립니다. 그다음, 각 인수 A (이제는 정수 값)는 n비트 2의 보수 이진 정수 값으로 변환됩니다. 두 비트 값은 비트 AND 연산을 사용하여 결합됩니다. 마지막으로, 얻어진 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 컬럼이 하나의 숫자 값 내에서 개별 비트로 여러 선택 사항을 인코딩한다고 가정합니다. 예를 들어, 창고에 있는 주문은 이진값 001 (십진수 1)로 표현됩니다. 지상 운송으로 발송되는 주문은 이진값 010 (십진수 2)로 표현됩니다. 보험 적용된 소포는 이진값 100 (십진수 4)로 표현됩니다. 이 예제에서는 DECODE 함수를 사용하여 order_status 값의 세 개의 비트 각각에 대해 비트가 켜져 있을 때와 꺼져 있을 때 각각 두 가지 값이 제공됩니다.

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이면 위치는 "창고"입니다. 다르면 위치는 "우체국"입니다.

MethodReceipt 컬럼은 비슷한 방식으로 계산됩니다. Method의 경우, BITANDorder_status와 2 (이진값 010)에 대해 AND 연산을 수행합니다. Receipt의 경우, BITANDorder_status와 4 (이진값 100)에 대해 AND 연산을 수행합니다.

 


출처: 오라클 레퍼런스

원문 링크: Oracle BITAND 함수 문서

 

반응형

댓글