ビット関数は、UInt8
、UInt16
、UInt32
、UInt64
、Int8
、Int16
、Int32
、Int64
、Float32
、またはFloat64
の任意の型のペアに対して動作します。一部の関数はString
およびFixedString
型をサポートしています。
結果の型は、その引数の最大ビット数と等しい整数です。引数のうち少なくとも1つが符号付きであれば、結果は符号付きの数になります。引数が浮動小数点数である場合、Int64
にキャストされます。
bitAnd
導入されたバージョン: v1.1
2つの値の間でビット単位のAND演算を行います。
構文
引数
返される値
ビット演算の結果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
数の二進数表現において、1に設定されたビットの数を計算します。
構文
引数
返される値
x
において1に設定されたビットの数を返します。 UInt8
。
注記
この関数は入力値をより大きな型に変換しません(符号拡張)。
例えば: bitCount(toUInt8(-1)) = 8
。
例
使用例
SELECT bin(333), bitCount(333);
┌─bin(333)─────────┬─bitCount(333)─┐
│ 0000000101001101 │ 5 │
└──────────────────┴───────────────┘
bitHammingDistance
導入されたバージョン: v21.1
2つの数のビット表現間のハミング距離を返します。
半重複文字列の検出のためにSimHash
関数と一緒に使用できます。
距離が小さいほど、文字列は類似しています。
構文
引数
返される値
x
とy
の間のハミング距離を返します。 UInt8
例
使用例
SELECT bitHammingDistance(111, 121);
┌─bitHammingDistance(111, 121)─┐
│ 3 │
└──────────────────────────────┘
bitNot
導入されたバージョン: v1.1
ビット単位のNOT演算を行います。
構文
引数
返される値
~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
2つの値の間でビット単位のOR演算を行います。
構文
引数
返される値
ビット演算の結果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
ビットを特定の位置数だけ左に回転させます。 外れたビットは右に巻き戻されます。
構文
引数
返される値
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
ビットを特定の位置数だけ右に回転させます。 外れたビットは左に巻き戻されます。
構文
引数
返される値
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
値の二進数表現を指定したビット位置数だけ左にシフトします。
FixedString
またはString
は1つのマルチバイト値として扱われます。
FixedString
値のビットは、シフトアウトされると失われます。
対照的に、String
値は追加のバイトで拡張されるため、ビットは失われません。
構文
引数
返される値
a
の型に等しいシフト値を返します。
例
バイナリエンコーディングの使用例
SELECT 99 AS a, bin(a), bitShiftLeft(a, 2) AS a_shifted, bin(a_shifted);
┌──a─┬─bin(99)──┬─a_shifted─┬─bin(bitShiftLeft(99, 2))─┐
│ 99 │ 01100011 │ 140 │ 10001100 │
└────┴──────────┴───────────┴──────────────────────────┘
16進数エンコーディングの使用例
SELECT 'abc' AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftLeft('abc', 4))─┐
│ abc │ 616263 │ &0 │ 06162630 │
└─────┴────────────┴───────────┴─────────────────────────────┘
Fixed Stringエンコーディングの使用例
SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftLeft(toFixedString('abc', 3), 4))─┐
│ abc │ 616263 │ &0 │ 162630 │
└─────┴──────────────────────────────┴───────────┴───────────────────────────────────────────────┘
bitShiftRight
導入されたバージョン: v1.1
値の二進数表現を指定したビット位置数だけ右にシフトします。
FixedString
またはString
は1つのマルチバイト値として扱われます。
FixedString
値のビットは、シフトアウトされると失われます。
対照的に、String
値は追加のバイトで拡張されるため、ビットは失われません。
構文
引数
返される値
a
の型に等しいシフト値を返します。
例
バイナリエンコーディングの使用例
SELECT 101 AS a, bin(a), bitShiftRight(a, 2) AS a_shifted, bin(a_shifted);
┌───a─┬─bin(101)─┬─a_shifted─┬─bin(bitShiftRight(101, 2))─┐
│ 101 │ 01100101 │ 25 │ 00011001 │
└─────┴──────────┴───────────┴────────────────────────────┘
16進数エンコーディングの使用例
SELECT 'abc' AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftRight('abc', 12))─┐
│ abc │ 616263 │ │ 0616 │
└─────┴────────────┴───────────┴───────────────────────────────┘
Fixed Stringエンコーディングの使用例
SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftRight(a, 12) AS a_shifted, hex(a_shifted);
┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftRight(toFixedString('abc', 3), 12))─┐
│ abc │ 616263 │ │ 000616 │
└─────┴──────────────────────────────┴───────────┴─────────────────────────────────────────────────┘
bitSlice
導入されたバージョン: v22.2
offset
インデックスから始まり、length
ビット長のサブストリングを返します。
構文
bitSlice(s, offset[, length])
引数
-
s
— スライスするStringまたはFixed String。 String
またはFixedString
-
offset
—
開始ビット位置を返します(1ベースのインデックス付け)。
-
正の値: 文字列の先頭からカウントします。
-
負の値: 文字列の末尾からカウントします。
(U)Int8/16/32/64
またはFloat*
-
length
—
オプション。抽出するビット数。
-
正の値: length
ビットを抽出します。
-
負の値: オフセットから(string_length - |length|)
まで抽出します。
-
省略時: オフセットから文字列の末尾まで抽出します。
-
長さが8の倍数でない場合、結果は右側にゼロでパディングされます。
(U)Int8/16/32/64
またはFloat*
返される値
抽出されたビットを含む文字列を返します。結果は常にバイト境界(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から始まります。
構文
引数
返される値
a
の二進数表現における位置i
のビットの値を返します。 UInt8
例
使用例
SELECT bin(2), bitTest(2, 1);
┌─bin(2)───┬─bitTest(2, 1)─┐
│ 00000010 │ 1 │
└──────────┴───────────────┘
bitTestAll
導入されたバージョン: v1.1
指定された位置にあるすべてのビットの論理共役(AND演算子)の結果を返します。
カウントは右から左へ行い、0から始まります。
2つのビット間の論理ANDは、両方の入力ビットが真である場合にのみ真です。
構文
bitTestAll(a, index1[, index2, ... , indexN])
引数
返される値
論理共役の結果を返します。 UInt8
例
使用例 1
SELECT bitTestAll(43, 0, 1, 3, 5);
┌─bin(43)──┬─bitTestAll(43, 0, 1, 3, 5)─┐
│ 00101011 │ 1 │
└──────────┴────────────────────────────┘
使用例 2
SELECT bitTestAll(43, 0, 1, 3, 5, 2);
┌─bin(43)──┬─bitTestAll(4⋯1, 3, 5, 2)─┐
│ 00101011 │ 0 │
└──────────┴──────────────────────────┘
bitTestAny
導入されたバージョン: v1.1
指定された位置にあるすべてのビットの論理選言(OR演算子)の結果を返します。
カウントは右から左へ行い、0から始まります。
2つのビット間の論理ORは、少なくとも1つの入力ビットが真である場合にのみ真です。
構文
bitTestAny(a, index1[, index2, ... , indexN])
引数
返される値
論理選言の結果を返します。 UInt8
例
使用例 1
SELECT bitTestAny(43, 0, 2);
┌─bin(43)──┬─bitTestAny(43, 0, 2)─┐
│ 00101011 │ 1 │
└──────────┴──────────────────────┘
使用例 2
SELECT bitTestAny(43, 4, 2);
┌─bin(43)──┬─bitTestAny(43, 4, 2)─┐
│ 00101011 │ 0 │
└──────────┴──────────────────────┘
bitXor
導入されたバージョン: v1.1
2つの値の間でビット単位の排他的OR(XOR)演算を行います。
構文
引数
返される値
ビット演算の結果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 │
└───┴───┴──────────────┘