Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

ビット関数

ビット関数は、UInt8UInt16UInt32UInt64Int8Int16Int32Int64Float32Float64 の任意の組み合わせの型に対して動作します。一部の関数は、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 — 整数または浮動小数点数。(U)Int* または Float*

戻り値

x のうち、1 に設定されているビットの数を返します。UInt8

使用例

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

bitHammingDistance

導入バージョン: v21.1.0

2 つの数値のビット表現間の ハミング距離 を返します。 ほぼ重複した文字列の検出には、SimHash 関数と組み合わせて使用できます。 距離が小さいほど、文字列同士はより類似しています。

構文

bitHammingDistance(x, y)

引数

  • x — ハミング距離の計算に使用する1番目の数値。(U)Int* または Float*
  • y — ハミング距離の計算に使用する2番目の数値。(U)Int* または Float*

戻り値

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

使用例

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

bitNot

導入バージョン: v1.1.0

ビット単位の NOT 演算を行います。

構文

bitNot(a)

引数

  • a — ビット単位の NOT 演算を適用する値。(U)Int* または Float* または String

戻り値

~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/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/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 と同じ型のシフト後の値を返します。

バイナリエンコーディングの使用例

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 と同じ型のシフト後の値を返します。

バイナリエンコーディングでの使用例

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 または FixedStringString または FixedString

  • offset — 開始ビット位置を指定します (1 始まり) 。

  • 正の値: 文字列の先頭から数えます。

  • 負の値: 文字列の末尾から数えます。

    (U)Int8/16/32/64 または Float*

  • 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 のバイナリ表現における位置 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])

引数

戻り値

論理積の結果を 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])

引数

戻り値

論理和の結果を返します。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 │
└───┴───┴──────────────┘
Navigation