[go: up one dir, main page]

メインコンテンツまでスキップ
メインコンテンツまでスキップ

ビット関数

ビット関数は、UInt8UInt16UInt32UInt64Int8Int16Int32Int64Float32、またはFloat64の任意の型のペアに対して動作します。一部の関数はStringおよびFixedString型をサポートしています。

結果の型は、その引数の最大ビット数と等しい整数です。引数のうち少なくとも1つが符号付きであれば、結果は符号付きの数になります。引数が浮動小数点数である場合、Int64にキャストされます。

bitAnd

導入されたバージョン: v1.1

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

数の二進数表現において、1に設定されたビットの数を計算します。

構文

bitCount(x)

引数

  • x — 整数または浮動小数点値。 (U)Int*またはFloat*

返される値

xにおいて1に設定されたビットの数を返します。 UInt8

注記

この関数は入力値をより大きな型に変換しません(符号拡張)。 例えば: bitCount(toUInt8(-1)) = 8

使用例

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

bitHammingDistance

導入されたバージョン: v21.1

2つの数のビット表現間のハミング距離を返します。 半重複文字列の検出のためにSimHash関数と一緒に使用できます。 距離が小さいほど、文字列は類似しています。

構文

bitHammingDistance(x, y)

引数

  • x — ハミング距離計算のための最初の数。 (U)Int*またはFloat*
  • y — ハミング距離計算のための2番目の数。 (U)Int*またはFloat*

返される値

xyの間のハミング距離を返します。 UInt8

使用例

SELECT bitHammingDistance(111, 121);
┌─bitHammingDistance(111, 121)─┐
│                            3 │
└──────────────────────────────┘

bitNot

導入されたバージョン: v1.1

ビット単位の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

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

ビットを特定の位置数だけ左に回転させます。 外れたビットは右に巻き戻されます。

構文

bitRotateLeft(a, N)

引数

返される値

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

ビットを特定の位置数だけ右に回転させます。 外れたビットは左に巻き戻されます。

構文

bitRotateRight(a, N)

引数

返される値

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値は追加のバイトで拡張されるため、ビットは失われません。

構文

bitShiftLeft(a, N)

引数

返される値

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値は追加のバイトで拡張されるため、ビットは失われません。

構文

bitShiftRight(a, N)

引数

返される値

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から始まります。

構文

bitTest(a, i)

引数

返される値

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)演算を行います。

構文

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 │
└───┴───┴──────────────┘