비트 함수
비트 함수 (Bit Functions)
정수에 대해 비트 단위 연산을 수행하는 함수 모음이에요. UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64 타입의 모든 쌍에 대해 동작해요.
출처: 문서
본문
비트 함수는 UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64 타입의 어떤 쌍에 대해서도 동작해요. 일부 함수는 String과 FixedString 타입을 지원해요. 결과 타입은 인자의 최대 비트 수와 같은 비트를 가진 정수예요. 인자 중 하나라도 부호가 있으면 결과는 부호 있는 숫자예요. 인자가 부동 소수점 숫자이면 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)
반환 값 (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)
반환 값 (Returned value)
x와 y 사이의 해밍 거리. UInt8
예제 (Examples)
쿼리:
SELECT bitHammingDistance(111, 121);
응답: 3
bitNot
비트 NOT 연산을 수행해요.
구문 (Syntax)
bitNot(a)
인자 (Arguments)
반환 값 (Returned value)
~a 즉 a의 비트를 뒤집은 결과.
예제 (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)
a— 회전할 값.(U)Int8/16/32/64N— 왼쪽으로 회전할 위치 수.UInt8/16/32/64
반환 값 (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)
a— 회전할 값.(U)Int8/16/32/64N— 오른쪽으로 회전할 위치 수.UInt8/16/32/64
반환 값 (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)
a— 이동할 값.(U)Int*,String또는FixedStringN— 이동할 위치 수.UInt8/16/32/64
반환 값 (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)
a— 이동할 값.(U)Int*,String또는FixedStringN— 이동할 위치 수.UInt8/16/32/64
반환 값 (Returned value)
a와 같은 타입의 이동된 값.
bitSlice
'offset' 인덱스의 비트에서 시작해 'length' 비트 길이인 부분 문자열을 반환해요.
구문 (Syntax)
bitSlice(s, offset[, length])
인자 (Arguments)
s— 슬라이스할 String 또는 Fixed String.String또는FixedStringoffset— 시작 비트 위치(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)
a— 변환할 숫자.(U)Int8/16/32/64또는Float*i— 반환할 비트의 위치.(U)Int8/16/32/64또는Float*
반환 값 (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)
a— 정수 값.(U)Int8/16/32/64index1, ...— 하나 또는 여러 비트 위치.(U)Int8/16/32/64
반환 값 (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)
a— 정수 값.(U)Int8/16/32/64index1, ...— 하나 또는 여러 비트 위치.(U)Int8/16/32/64
반환 값 (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 │
└───┴───┴──────────────┘