:meta-keywords: CUBRID bitwise operator, cubrid bit_and, cubrid bit_or, cubrid bit_xor, cubrid bit_count
:meta-description: A Bitwise operator performs operations in bits, and can be used in arithmetic operations.

:tocdepth: 3

******************
비트 함수와 연산자
******************

.. contents::

비트 연산자
===========

비트 연산자(Bitwise operator)는 비트 단위로 연산을 수행하며 산술 연산식에서 이용될 수 있다. 피연산자로 정수 타입이 지정되며, **BIT** 타입은 지정될 수 없다. 연산 결과로 **BIGINT** 타입 정수(64비트 정수)를 반환한다. 이때, 하나 이상의 피연산자가 **NULL** 이면 **NULL** 을 반환한다.

아래는 CUBRID가 지원하는 비트 연산자의 종류에 관한 표이다.

**비트 연산자**

+----------------------+------------------------------------------------------------------------------------------------------------------------------------------------+----------------+------------------+
| 비트 연산자          | 설명                                                                                                                                           | 조건식         | 리턴 값          |
+======================+================================================================================================================================================+================+==================+
| &                    | 비트 단위로 **AND** 연산을 수행하고, **BIGINT** 정수를 반환한다.                                                                               | 17 & 3         | 1                |
+----------------------+------------------------------------------------------------------------------------------------------------------------------------------------+----------------+------------------+
| \|                   | 비트 단위로 **OR** 연산을 수행하고, **BIGINT** 정수를 반환한다.                                                                                | 17 \| 3        | 19               |
+----------------------+------------------------------------------------------------------------------------------------------------------------------------------------+----------------+------------------+
| ^                    | 비트 단위로 **XOR**  연산을 수행하고, **BIGINT**  정수를 반환한다.                                                                             | 17 ^ 3         | 18               |
+----------------------+------------------------------------------------------------------------------------------------------------------------------------------------+----------------+------------------+
| ~                    | 단항 연산자이며, 피연산자의 비트를 역으로 전환(**INVERT**)하는 보수 연산을 수행하고, **BIGINT** 정수를 반환한다.                               | ~17            | -18              |
+----------------------+------------------------------------------------------------------------------------------------------------------------------------------------+----------------+------------------+
| <<                   | 왼쪽 피연산자의 비트를 오른쪽 피연산자만큼 왼쪽으로 이동시키는 연산을 수행하고, **BIGINT** 정수를 반환한다.                                    | 17 << 3        | 136              |
+----------------------+------------------------------------------------------------------------------------------------------------------------------------------------+----------------+------------------+
| >>                   | 왼쪽 피연산자의 비트를 오른쪽 피연산자만큼 오른쪽으로 이동시키는 연산을 수행하고, **BIGINT** 정수를 반환한다.                                  | 17 >> 3        | 2                |
+----------------------+------------------------------------------------------------------------------------------------------------------------------------------------+----------------+------------------+

BIT_AND
=======

.. function:: BIT_AND (expr)

    집계 함수로서, *expr* 의 모든 비트에 대해 비트 단위 **AND** 연산을 수행한다. 조건절을 만족하는 행이 없는 경우, NULL 을 반환한다.

    :param expr: 정수 타입의 임의의 연산식이다.
    :rtype: BIGINT

.. code-block:: sql

    CREATE TABLE bit_tbl(id int);
    INSERT INTO bit_tbl VALUES (1), (2), (3), (4), (5);
    SELECT 1&3&5, BIT_AND(id) FROM bit_tbl WHERE id in(1,3,5);

::

         1&3&5           bit_and(id)
    ============================================
             1                     1    

BIT_OR
======

.. function:: BIT_OR (expr)

    집계 함수로서, *expr* 의 모든 비트에 대해 비트 단위 **OR** 연산을 수행한다. 조건절을 만족하는 행이 없는 경우, **NULL** 을 반환한다.

    :param expr: 정수 타입의 임의의 연산식이다.
    :rtype: BIGINT

.. code-block:: sql

    SELECT 1|3|5, BIT_OR(id) FROM bit_tbl WHERE id in(1,3,5);

::

         1|3|5            bit_or(id)
    ============================================
              7                     7
               
BIT_XOR
=======
  
.. function:: BIT_XOR (expr)

    집계 함수로서, *expr* 의 모든 비트에 대해 비트 단위 **XOR** 연산을 수행한다. 조건절을 만족하는 행이 없는 경우, **NULL** 을 반환한다.

    :param expr: 정수 타입의 임의의 연산식이다.
    :rtype: BIGINT

.. code-block:: sql

    SELECT 1^2^3, BIT_XOR(id) FROM bit_tbl WHERE id in(1,3,5);

::

         1^3^5            bit_xor(id)
    ============================================
              7                     7

BIT_COUNT
=========

.. function:: BIT_COUNT (expr)

    *expr*\의 모든 비트 중 1로 설정된 비트의 개수를 반환하는 함수이며, 집계 함수는 아니다.

    :param expr: 정수 타입의 임의의 연산식이다.
    :rtype: BIGINT

.. code-block:: sql

    SELECT BIT_COUNT(id) FROM bit_tbl WHERE id in(1,3,5);

::

       bit_count(id)
    ================
           1
           2
           2