비트 함수

비트 함수 (Bit Functions)

정수에 대해 비트 단위 연산을 수행하는 함수 모음이에요. UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64 타입의 모든 쌍에 대해 동작해요.

출처: 문서

본문

비트 함수는 UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64 타입의 어떤 쌍에 대해서도 동작해요. 일부 함수는 StringFixedString 타입을 지원해요. 결과 타입은 인자의 최대 비트 수와 같은 비트를 가진 정수예요. 인자 중 하나라도 부호가 있으면 결과는 부호 있는 숫자예요. 인자가 부동 소수점 숫자이면 Int64로 캐스팅돼요.

bitAnd

두 값 사이의 비트 AND 연산을 수행해요.

구문 (Syntax)

bitAnd(a, b)

인자 (Arguments)

반환 값 (Returned value)

비트 연산 a AND b의 결과.

예제 (Examples)

CREATE TABLE bits
(
    `a` UInt8,
    `b` UInt8
)
ENGINE = Memory;

INSERT INTO bits VALUES (0, 0), (0, 1), (1, 0), (1, 1);

SELECT
    a,
    b,
    bitAnd(a, b)
FROM bits

응답:

┌─a─┬─b─┬─bitAnd(a, b)─┐
│ 0 │ 0 │            0 │
│ 0 │ 1 │            0 │
│ 1 │ 0 │            0 │
│ 1 │ 1 │            1 │
└───┴───┴──────────────┘

bitCount

숫자의 이진 표현에서 1로 설정된 비트의 개수를 계산해요.

구문 (Syntax)

bitCount(x)

인자 (Arguments)

  • x — 정수 또는 부동 소수점 값. (U)Int* 또는 Float*

반환 값 (Returned value)

x에서 1로 설정된 비트의 개수. UInt8

이 함수는 입력 값을 더 큰 타입으로 변환하지 않아요(부호 확장 없음). 예: bitCount(toUInt8(-1)) = 8.

예제 (Examples)

쿼리:

SELECT bin(333), bitCount(333);

응답:

┌─bin(333)─────────┬─bitCount(333)─┐
│ 0000000101001101 │             5 │
└──────────────────┴───────────────┘

bitHammingDistance

두 숫자의 비트 표현 사이의 해밍 거리(Hamming Distance)를 반환해요. 반 중복 문자열 탐지를 위해 SimHash 함수와 함께 사용할 수 있어요. 거리가 작을수록 문자열이 더 유사해요.

구문 (Syntax)

bitHammingDistance(x, y)

인자 (Arguments)

  • x — 해밍 거리 계산을 위한 첫 번째 숫자. (U)Int* 또는 Float*
  • y — 해밍 거리 계산을 위한 두 번째 숫자. (U)Int* 또는 Float*

반환 값 (Returned value)

xy 사이의 해밍 거리. UInt8

예제 (Examples)

쿼리:

SELECT bitHammingDistance(111, 121);

응답: 3

bitNot

비트 NOT 연산을 수행해요.

구문 (Syntax)

bitNot(a)

인자 (Arguments)

반환 값 (Returned value)

~aa의 비트를 뒤집은 결과.

예제 (Examples)

쿼리:

SELECT
    CAST('5', 'UInt8') AS original,
    bin(original) AS original_binary,
    bitNot(original) AS result,
    bin(bitNot(original)) AS result_binary;

응답:

┌─original─┬─original_binary─┬─result─┬─result_binary─┐
│        5 │ 00000101        │    250 │ 11111010      │
└──────────┴─────────────────┴────────┴───────────────┘

bitOr

두 값 사이의 비트 OR 연산을 수행해요.

구문 (Syntax)

bitOr(a, b)

인자 (Arguments)

반환 값 (Returned value)

비트 연산 a OR b의 결과.

bitRotateLeft

비트를 왼쪽으로 특정 위치 수만큼 회전시켜요. 떨어져 나간 비트는 오른쪽으로 다시 감싸져요.

구문 (Syntax)

bitRotateLeft(a, N)

인자 (Arguments)

반환 값 (Returned value)

a와 같은 타입의 회전된 값. (U)Int8/16/32/64

예제 (Examples)

쿼리:

SELECT 99 AS a, bin(a), bitRotateLeft(a, 2) AS a_rotated, bin(a_rotated);

응답:

┌──a─┬─bin(a)───┬─a_rotated─┬─bin(a_rotated)─┐
│ 99 │ 01100011 │       141 │ 10001101       │
└────┴──────────┴───────────┴────────────────┘

bitRotateRight

비트를 오른쪽으로 특정 위치 수만큼 회전시켜요. 떨어져 나간 비트는 왼쪽으로 다시 감싸져요.

구문 (Syntax)

bitRotateRight(a, N)

인자 (Arguments)

반환 값 (Returned value)

a와 같은 타입의 회전된 값. (U)Int8/16/32/64

예제 (Examples)

쿼리:

SELECT 99 AS a, bin(a), bitRotateRight(a, 2) AS a_rotated, bin(a_rotated);

응답:

┌──a─┬─bin(a)───┬─a_rotated─┬─bin(a_rotated)─┐
│ 99 │ 01100011 │       216 │ 11011000       │
└────┴──────────┴───────────┴────────────────┘

bitShiftLeft

값의 이진 표현을 지정한 비트 위치 수만큼 왼쪽으로 이동시켜요. FixedString 또는 String은 단일 다중 바이트 값으로 취급돼요. FixedString 값의 비트는 이동하면서 손실돼요. 반면 String 값은 추가 바이트로 확장되므로 손실되는 비트가 없어요.

구문 (Syntax)

bitShiftLeft(a, N)

인자 (Arguments)

반환 값 (Returned value)

a와 같은 타입의 이동된 값.

예제 (Examples)

SELECT 99 AS a, bin(a), bitShiftLeft(a, 2) AS a_shifted, bin(a_shifted);

응답: {a: 99, bin: "01100011", a_shifted: 140, bin_shifted: "10001100"}

SELECT 'abc' AS a, hex(a), hex(bitShiftLeft(a, 4)) AS a_shifted;

응답: {a: "abc", hex: "616263", a_shifted: "06162630"}

bitShiftRight

값의 이진 표현을 지정한 비트 위치 수만큼 오른쪽으로 이동시켜요. FixedString 또는 String은 단일 다중 바이트 값으로 취급돼요. FixedString 값의 비트는 이동하면서 손실돼요. 반면 String 값은 추가 바이트로 확장되므로 손실되는 비트가 없어요.

구문 (Syntax)

bitShiftRight(a, N)

인자 (Arguments)

반환 값 (Returned value)

a와 같은 타입의 이동된 값.

bitSlice

'offset' 인덱스의 비트에서 시작해 'length' 비트 길이인 부분 문자열을 반환해요.

구문 (Syntax)

bitSlice(s, offset[, length])

인자 (Arguments)

  • s — 슬라이스할 String 또는 Fixed String. String 또는 FixedString
  • offset — 시작 비트 위치(1 기반 인덱스).
    • 양수 값: 문자열의 시작부터 셈.
    • 음수 값: 문자열의 끝부터 셈. (U)Int8/16/32/64 또는 Float*
  • length — 선택 사항. 추출할 비트 수.
    • 양수 값: length 비트를 추출.
    • 음수 값: offset부터 (string_length - |length|)까지 추출.
    • 생략: offset부터 문자열 끝까지 추출.
    • length가 8의 배수가 아니면 결과는 오른쪽에 0으로 패딩돼요. (U)Int8/16/32/64 또는 Float*

반환 값 (Returned value)

이진 시퀀스로 표현된 추출된 비트를 담은 문자열. 결과는 항상 바이트 경계(8비트의 배수)로 패딩돼요. String

예제 (Examples)

SELECT bin('Hello'), bin(bitSlice('Hello', 1, 8));
SELECT bin('Hello'), bin(bitSlice('Hello', 1, 2));
SELECT bin('Hello'), bin(bitSlice('Hello', 1, 9));
SELECT bin('Hello'), bin(bitSlice('Hello', -4, 8));

bitTest

임의의 숫자를 이진 형태로 변환한 다음, 지정한 위치의 비트 값을 반환해요. 오른쪽에서 왼쪽으로 0부터 셈.

구문 (Syntax)

bitTest(a, i)

인자 (Arguments)

반환 값 (Returned value)

a의 이진 표현에서 위치 i의 비트 값. UInt8

예제 (Examples)

쿼리:

SELECT bin(2), bitTest(2, 1);

응답:

┌─bin(2)───┬─bitTest(2, 1)─┐
│ 00000010 │             1 │
└──────────┴───────────────┘

bitTestAll

주어진 위치들의 모든 비트의 논리곱(AND 연산자) 결과를 반환해요. 오른쪽에서 왼쪽으로 0부터 셈. 두 비트 간 논리 AND는 두 입력 비트가 모두 참일 때만 참이에요.

구문 (Syntax)

bitTestAll(a, index1[, index2, ... , indexN])

인자 (Arguments)

반환 값 (Returned value)

논리곱의 결과. UInt8

예제 (Examples)

SELECT bitTestAll(43, 0, 1, 3, 5);  -- 1
SELECT bitTestAll(43, 0, 1, 3, 5, 2);  -- 0

bitTestAny

숫자에서 주어진 위치들의 모든 비트의 논리합(OR 연산자) 결과를 반환해요. 오른쪽에서 왼쪽으로 0부터 셈. 두 비트 간 논리 OR는 입력 비트 중 하나라도 참이면 참이에요.

구문 (Syntax)

bitTestAny(a, index1[, index2, ... , indexN])

인자 (Arguments)

반환 값 (Returned value)

논리합의 결과. UInt8

예제 (Examples)

SELECT bitTestAny(43, 0, 2);  -- 1
SELECT bitTestAny(43, 4, 2);  -- 0

bitXor

두 값 사이의 비트 배타적 논리합(XOR) 연산을 수행해요.

구문 (Syntax)

bitXor(a, b)

인자 (Arguments)

반환 값 (Returned value)

비트 연산 a XOR b의 결과.

예제 (Examples)

CREATE TABLE bits
(
    `a` UInt8,
    `b` UInt8
)
ENGINE = Memory;

INSERT INTO bits VALUES (0, 0), (0, 1), (1, 0), (1, 1);

SELECT
    a,
    b,
    bitXor(a, b)
FROM bits;

응답:

┌─a─┬─b─┬─bitXor(a, b)─┐
│ 0 │ 0 │            0 │
│ 0 │ 1 │            1 │
│ 1 │ 0 │            1 │
│ 1 │ 1 │            0 │
└───┴───┴──────────────┘

더 알아보기 (Learn more)