位操作函数
位操作函数适用于UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64,Float32或Float64中的任何类型。
结果类型是一个整数,其位数等于其参数的最大位。如果至少有一个参数为有符数字,则结果为有符数字。如果参数是浮点数,则将其强制转换为Int64。
bitAnd(a, b)
bitOr(a, b)
bitXor(a, b)
bitNot(a)
bitShiftLeft(a, b)
将值的二进制表示向左移动指定数量的位。
FixedString
或 String
被视为单个多字节值。
FixedString
值的位在移出时会丢失。相反,String
值使用额外的字节进行扩展,因此不会丢失任何位。
语法
bitShiftLeft(a, b)
参数
a
— 要进行移位操作的值。类型可以为Integer types,String或者FixedString。b
— 移位的次数。类型为Unsigned integer types,允许使用64位数字及64位以下的数字类型。
返回值
- 移位后的值。
返回值的类型与输入值的类型相同。
示例
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
— 需要进行位移的值。类型可以为Integer types,String或者FixedString。b
— 移位的次数。类型为Unsigned integer types,允许使用64位数字及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
— 类型可以是String或者FixedString。offset
— 带位的起始索引,正值表示左侧偏移,负值表示右侧缩进,位编号从 1 开始。length
— 带位的子串长度。如果您指定一个负值,该函数将返回一个开放子字符串 [offset, array_length - length]。如果省略该值,该函数将返回子字符串 [offset, the_end_string]。如果长度超过s,将被截断。如果长度不是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 │