ビット関数は、UInt8、UInt16、UInt32、UInt64、Int8、Int16、Int32、Int64、Float32、Float64 の任意の組み合わせの型に対して動作します。一部の関数は、String 型および FixedString 型もサポートしています。
結果の型は、引数の中で最大のビット数を持つ整数型になります。少なくとも 1 つの引数が符号付きの場合、結果は符号付き整数になります。引数が浮動小数点数の場合は、Int64 にキャストされます。
bitAnd
導入バージョン: v1.1.0
2つの値に対してビット単位のAND演算を行います。
構文
bitAnd(a, b)引数
戻り値
ビット単位の演算 a AND b の結果を返します
例
使用例
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
導入バージョン: v20.3.0
数値のバイナリ表現において、1 であるビットの数を計算します。
構文
bitCount(x)引数
戻り値
x のうち、1 に設定されているビットの数を返します。UInt8。
例
使用例
SELECT bin(333), bitCount(333);┌─bin(333)─────────┬─bitCount(333)─┐
│ 0000000101001101 │ 5 │
└──────────────────┴───────────────┘bitHammingDistance
導入バージョン: v21.1.0
2 つの数値のビット表現間の ハミング距離 を返します。
ほぼ重複した文字列の検出には、SimHash 関数と組み合わせて使用できます。
距離が小さいほど、文字列同士はより類似しています。
構文
bitHammingDistance(x, y)引数
戻り値
x と y のハミング距離を返します UInt8
例
使用例
SELECT bitHammingDistance(111, 121);┌─bitHammingDistance(111, 121)─┐
│ 3 │
└──────────────────────────────┘bitNot
導入バージョン: v1.1.0
ビット単位の NOT 演算を行います。
構文
bitNot(a)引数
戻り値
~a の結果、つまり a の各ビットを反転した値を返します。
例
使用例
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
導入バージョン: v1.1.0
2つの値の間でビット単位の OR 演算を実行します。
構文
bitOr(a, b)引数
戻り値
ビット単位の演算 a OR b の結果を返します
例
使用例
CREATE TABLE bits
(
`a` UInt8,
`b` UInt8
)
ENGINE = Memory;
INSERT INTO bits VALUES (0, 0), (0, 1), (1, 0), (1, 1);
SELECT
a,
b,
bitOr(a, b)
FROM bits;┌─a─┬─b─┬─bitOr(a, b)─┐
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 1 │
│ 1 │ 0 │ 1 │
│ 1 │ 1 │ 1 │
└───┴───┴─────────────┘bitRotateLeft
導入バージョン: v1.1.0
ビットを指定した位置数だけ左に回転します。あふれたビットは右側に回り込みます。
構文
bitRotateLeft(a, N)引数
a— ローテーションする値。(U)Int8/16/32/64N— 左にローテーションする位置数。UInt8/16/32/64
戻り値
a と同じ型の、ローテーション後の値を返します。(U)Int8/16/32/64
例
使用例
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
導入バージョン: v1.1.0
ビットを指定した数だけ右に回転します。右端からあふれたビットは左端に回り込みます。
構文
bitRotateRight(a, N)引数
a— 回転させる値。(U)Int8/16/32/64N— 右方向に回転させる位置数。UInt8/16/32/64
戻り値
a と同じ型の回転後の値を返します。(U)Int8/16/32/64
例
使用例
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
導入バージョン: v1.1.0
値のバイナリ表現を、指定したビット位置数だけ左にシフトします。
FixedString または String は、1 つのマルチバイト値として扱われます。
FixedString の値は、シフトによって外に押し出されたビットが失われます。
一方、String の値は追加のバイトで拡張されるため、ビットは失われません。
構文
bitShiftLeft(a, N)引数
a— シフト対象の値。(U)Int*またはStringまたはFixedStringN— シフトする位置数。UInt8/16/32/64
戻り値
a と同じ型のシフト後の値を返します。
例
バイナリエンコーディングの使用例
SELECT 99 AS a, bin(a), bitShiftLeft(a, 2) AS a_shifted, bin(a_shifted);┌──a─┬─bin(a)───┬─a_shifted─┬─bin(a_shifted)─┐
│ 99 │ 01100011 │ 140 │ 10001100 │
└────┴──────────┴───────────┴────────────────┘16進エンコーディングでの使用例
-- The shifted value is binary, so it is shown with `hex`.
SELECT 'abc' AS a, hex(a), hex(bitShiftLeft(a, 4)) AS a_shifted;┌─a───┬─hex(a)─┬─a_shifted─┐
│ abc │ 616263 │ 06162630 │
└─────┴────────┴───────────┘Fixed Stringエンコーディングの使用例
SELECT toFixedString('abc', 3) AS a, hex(a), hex(bitShiftLeft(a, 4)) AS a_shifted;┌─a───┬─hex(a)─┬─a_shifted─┐
│ abc │ 616263 │ 162630 │
└─────┴────────┴───────────┘bitShiftRight
導入バージョン: v1.1.0
値のバイナリ表現を、指定した数のビット位置だけ右にシフトします。
FixedString または String は、1 つのマルチバイト値として扱われます。
FixedString の値では、シフトによって外に出たビットは失われます。
一方、String の値は追加のバイトで拡張されるため、ビットは失われません。
構文
bitShiftRight(a, N)引数
a— シフト対象の値。(U)Int*またはStringまたはFixedStringN— シフトする位置数。UInt8/16/32/64
戻り値
a と同じ型のシフト後の値を返します。
例
バイナリエンコーディングでの使用例
SELECT 101 AS a, bin(a), bitShiftRight(a, 2) AS a_shifted, bin(a_shifted);┌───a─┬─bin(a)───┬─a_shifted─┬─bin(a_shifted)─┐
│ 101 │ 01100101 │ 25 │ 00011001 │
└─────┴──────────┴───────────┴────────────────┘16進エンコーディングを使用した使用例
-- The shifted value is binary, so it is shown with `hex`.
SELECT 'abc' AS a, hex(a), hex(bitShiftRight(a, 12)) AS a_shifted;┌─a───┬─hex(a)─┬─a_shifted─┐
│ abc │ 616263 │ 0616 │
└─────┴────────┴───────────┘Fixed Stringエンコーディングの使用例
SELECT toFixedString('abc', 3) AS a, hex(a), hex(bitShiftRight(a, 12)) AS a_shifted;┌─a───┬─hex(a)─┬─a_shifted─┐
│ abc │ 616263 │ 000616 │
└─────┴────────┴───────────┘bitSlice
導入バージョン: v22.2.0
'offset' 番目のビットから始まる、長さが 'length' ビットの部分文字列を返します。
構文
bitSlice(s, offset[, length])引数
-
s— スライス対象のStringまたはFixedString。StringまたはFixedString -
offset— 開始ビット位置を指定します (1 始まり) 。 -
正の値: 文字列の先頭から数えます。
-
負の値: 文字列の末尾から数えます。
-
length— 省略可能。抽出するビット数です。 -
正の値:
lengthビットを抽出します。 -
負の値:
offsetから(string_length - |length|)までを抽出します。 -
省略時:
offsetから文字列の末尾までを抽出します。 -
lengthが 8 の倍数でない場合、結果の右側は 0 で埋められます。(U)Int8/16/32/64またはFloat*
戻り値
抽出されたビットを含む文字列を返します。ビットは 2 進数列として表されます。結果は常にバイト境界 (8 ビットの倍数) に合わせてパディングされます String
例
使用例
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));┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 8))─┐
│ 0100100001100101011011000110110001101111 │ 01001000 │
└──────────────────────────────────────────┴──────────────────────────────┘
┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 2))─┐
│ 0100100001100101011011000110110001101111 │ 01000000 │
└──────────────────────────────────────────┴──────────────────────────────┘
┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 9))─┐
│ 0100100001100101011011000110110001101111 │ 0100100000000000 │
└──────────────────────────────────────────┴──────────────────────────────┘
┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', -4, 8))─┐
│ 0100100001100101011011000110110001101111 │ 11110000 │
└──────────────────────────────────────────┴───────────────────────────────┘bitTest
導入バージョン: v1.1.0
任意の数値を 2 進数表現 に変換し、指定した位置のビットの値を返します。位置は右から左へ、0 から数えます。
構文
bitTest(a, i)引数
a— 変換する数値。(U)Int8/16/32/64またはFloat*i— 返すビットの位置。(U)Int8/16/32/64またはFloat*
戻り値
a のバイナリ表現における位置 i のビット値を返します。UInt8
例
使用例
SELECT bin(2), bitTest(2, 1);┌─bin(2)───┬─bitTest(2, 1)─┐
│ 00000010 │ 1 │
└──────────┴───────────────┘bitTestAll
導入バージョン: v1.1.0
指定した位置にあるすべてのビットに対する論理積 (AND 演算子) の結果を返します。 ビット位置は右から左へ、0 から数えます。
2 つのビットの論理 AND は、両方の入力ビットが true の場合に限り true になります。
構文
bitTestAll(a, index1[, index2, ... , indexN])引数
a— 整数値。(U)Int8/16/32/64index1, ...— 1 つ以上のビットの位置。(U)Int8/16/32/64
戻り値
論理積の結果を UInt8 で返します
例
使用例 1
SELECT bitTestAll(43, 0, 1, 3, 5);┌─bitTestAll(43, 0, 1, 3, 5)─┐
│ 1 │
└────────────────────────────┘使用例 2
SELECT bitTestAll(43, 0, 1, 3, 5, 2);┌─bitTestAll(43, 0, 1, 3, 5, 2)─┐
│ 0 │
└───────────────────────────────┘bitTestAny
導入バージョン: v1.1.0
数値内の指定された位置にあるすべてのビットに対して、論理和 (OR 演算子) を取った結果を返します。 ビット位置は 0 から始まり、右から左に数えます。
2 つのビットの論理 OR は、入力ビットの少なくとも一方が true であれば true になります。
構文
bitTestAny(a, index1[, index2, ... , indexN])引数
a— 整数値。(U)Int8/16/32/64index1, ...— 1 つ以上のビット位置。(U)Int8/16/32/64
戻り値
論理和の結果を返します。UInt8
例
使用例 1
SELECT bitTestAny(43, 0, 2);┌─bitTestAny(43, 0, 2)─┐
│ 1 │
└──────────────────────┘使用例 2
SELECT bitTestAny(43, 4, 2);┌─bitTestAny(43, 4, 2)─┐
│ 0 │
└──────────────────────┘bitXor
導入バージョン: v1.1.0
2 つの値に対して、ビット単位の排他的論理和 (XOR) 演算を実行します。
構文
bitXor(a, b)引数
戻り値
ビット単位の演算 a XOR b の結果を返します
例
使用例
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 │
└───┴───┴──────────────┘