ビット関数
ビット関数は、UInt8、UInt16、UInt32、UInt64、Int8、Int16、Int32、Int64、Float32、Float64の任意のペアの型に対して機能します。一部の関数はStringおよびFixedString型もサポートしています。
結果の型は、その引数の最大ビット数に等しい整数です。少なくとも一つの引数が符号付きである場合、結果は符号付き数になります。引数が浮動小数点数の場合、それはInt64にキャストされます。
bitAnd(a, b)
bitOr(a, b)
bitXor(a, b)
bitNot(a)
bitShiftLeft(a, b)
値のバイナリ表現を指定されたビット位置数だけ左にシフトします。
FixedStringまたはStringは単一のマルチバイト値として扱われます。
FixedString値のビットはシフトアウトされると失われます。一方、String値は追加のバイトで拡張されるため、ビットは失われません。
構文
bitShiftLeft(a, b)
引数
- a— シフトする値です。整数型、String、またはFixedString。
- b— シフト位置の数です。符号なし整数型、64ビット型以下が許可されます。
返される値
- シフトされた値。
返される値の型は、入力値の型と同じです。
例
以下のクエリでは、シフトされた値のビットを表示するためにbinおよびhex関数が使用されます。
SELECT 99 AS a, bin(a), bitShiftLeft(a, 2) AS a_shifted, bin(a_shifted);
SELECT 'abc' AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted);
結果:
┌──a─┬─bin(99)──┬─a_shifted─┬─bin(bitShiftLeft(99, 2))─┐
│ 99 │ 01100011 │       140 │ 10001100                 │
└────┴──────────┴───────────┴──────────────────────────┘
┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftLeft('abc', 4))─┐
│ abc │ 616263     │ &0        │ 06162630                    │
└─────┴────────────┴───────────┴─────────────────────────────┘
┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftLeft(toFixedString('abc', 3), 4))─┐
│ abc │ 616263                       │ &0        │ 162630                                        │
└─────┴──────────────────────────────┴───────────┴───────────────────────────────────────────────┘
bitShiftRight(a, b)
値のバイナリ表現を指定されたビット位置数だけ右にシフトします。
FixedStringまたはStringは単一のマルチバイト値として扱われます。String値の長さはビットがシフトアウトされると減少しますので注意してください。
構文
bitShiftRight(a, b)
引数
- a— シフトする値です。整数型、String、またはFixedString。
- b— シフト位置の数です。符号なし整数型、64ビット型以下が許可されます。
返される値
- シフトされた値。
返される値の型は、入力値の型と同じです。
例
クエリ:
SELECT 101 AS a, bin(a), bitShiftRight(a, 2) AS a_shifted, bin(a_shifted);
SELECT 'abc' AS a, hex(a), bitShiftRight(a, 12) AS a_shifted, hex(a_shifted);
SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftRight(a, 12) AS a_shifted, hex(a_shifted);
結果:
┌───a─┬─bin(101)─┬─a_shifted─┬─bin(bitShiftRight(101, 2))─┐
│ 101 │ 01100101 │        25 │ 00011001                   │
└─────┴──────────┴───────────┴────────────────────────────┘
┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftRight('abc', 12))─┐
│ abc │ 616263     │           │ 0616                          │
└─────┴────────────┴───────────┴───────────────────────────────┘
┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftRight(toFixedString('abc', 3), 12))─┐
│ abc │ 616263                       │           │ 000616                                          │
└─────┴──────────────────────────────┴───────────┴─────────────────────────────────────────────────┘
bitRotateLeft(a, b)
bitRotateRight(a, b)
bitSlice(s, offset, length)
‘offset’インデックスから始まる‘length’ビットのビットサブストリングを返します。ビットのインデックスは1から始まります。
構文
bitSlice(s, offset[, length])
引数
- s— sはStringまたはFixedString。
- offset— ビットの開始インデックス。正の値は左からのオフセットを示し、負の値は右からのインデントを示します。ビットの番号付けは1から始まります。
- length— ビットのサブストリングの長さ。負の値を指定すると、関数は開いたサブストリング[offset, array_length - length]を返します。値を省略すると、関数はサブストリング[offset, the_end_string]を返します。lengthがsを超えると切り捨てられます。lengthが8の倍数でない場合、右に0を埋めます。
返される値
- サブストリング。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                      │
└──────────────────────────────────────────┴───────────────────────────────┘
byteSlice(s, offset, length)
関数substringを参照してください。
bitTest
任意の整数を2進法に変換し、指定された位置にあるビットの値を返します。カウントは右から左へ0から始まります。
構文
SELECT bitTest(number, index)
引数
- number– 整数。
- index– ビットの位置。
返される値
- 指定された位置にあるビットの値。UInt8。
例
例えば、10進数で43の数は2進数で101011です。
クエリ:
SELECT bitTest(43, 1);
結果:
┌─bitTest(43, 1)─┐
│              1 │
└────────────────┘
別の例:
クエリ:
SELECT bitTest(43, 2);
結果:
┌─bitTest(43, 2)─┐
│              0 │
└────────────────┘
bitTestAll
指定された位置のすべてのビットの論理積(AND演算子)の結果を返します。カウントは右から左へ、0から始まります。
ビット単位の演算での積:
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
構文
SELECT bitTestAll(number, index1, index2, index3, index4, ...)
引数
- number– 整数。
- index1,- index2,- index3,- index4– ビットの位置。例えば、位置のセット (- index1,- index2,- index3,- index4) がすべて真である場合(- index1⋀- index2⋀- index3⋀- index4)にのみ真です。
返される値
- 論理積の結果。UInt8。
例
例えば、10進数で43の数は2進数で101011です。
クエリ:
SELECT bitTestAll(43, 0, 1, 3, 5);
結果:
┌─bitTestAll(43, 0, 1, 3, 5)─┐
│                          1 │
└────────────────────────────┘
別の例:
クエリ:
SELECT bitTestAll(43, 0, 1, 3, 5, 2);
結果:
┌─bitTestAll(43, 0, 1, 3, 5, 2)─┐
│                             0 │
└───────────────────────────────┘
bitTestAny
指定された位置のすべてのビットの論理和(OR演算子)の結果を返します。カウントは右から左へ、0から始まります。
ビット単位の演算での和:
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
構文
SELECT bitTestAny(number, index1, index2, index3, index4, ...)
引数
- number– 整数。
- index1,- index2,- index3,- index4– ビットの位置。
返される値
- 論理和の結果。UInt8。
例
例えば、10進数で43の数は2進数で101011です。
クエリ:
SELECT bitTestAny(43, 0, 2);
結果:
┌─bitTestAny(43, 0, 2)─┐
│                    1 │
└──────────────────────┘
別の例:
クエリ:
SELECT bitTestAny(43, 4, 2);
結果:
┌─bitTestAny(43, 4, 2)─┐
│                    0 │
└──────────────────────┘
bitCount
数の2進表現で1に設定されたビットの数を計算します。
構文
bitCount(x)
引数
返される値
- 入力数で1に設定されたビットの数。UInt8。
この関数は、入力値をより大きな型に変換しません(符号拡張)。例えば、bitCount(toUInt8(-1)) = 8です。
例
例えば、数値333を取り上げます。その2進表現: 0000000101001101。
クエリ:
SELECT bitCount(333);
結果:
┌─bitCount(333)─┐
│             5 │
└───────────────┘
bitHammingDistance
2つの整数値のビット表現間のハミング距離を返します。SimHash関数と組み合わせて、半重複文字列の検出に使用できます。距離が小さいほど、それらの文字列が同じである可能性が高くなります。
構文
bitHammingDistance(int1, int2)
引数
返される値
- ハミング距離。UInt8。
例
クエリ:
SELECT bitHammingDistance(111, 121);
結果:
┌─bitHammingDistance(111, 121)─┐
│                            3 │
└──────────────────────────────┘
SimHashと一緒に:
SELECT bitHammingDistance(ngramSimHash('cat ate rat'), ngramSimHash('rat ate cat'));
結果:
┌─bitHammingDistance(ngramSimHash('cat ate rat'), ngramSimHash('rat ate cat'))─┐
│                                                                            5 │
└──────────────────────────────────────────────────────────────────────────────┘