跳到主要内容

位串函数和操作符

位串表示一串 0/1,适合紧凑标志或协议字段。bit(n) 长度固定,bit varying(n) 长度可变;与保存字节的 bytea 不是同一类型。以下使用 PostgreSQL。

逻辑和位移​

SELECT B'1010' & B'1100', B'1010' | B'1100', B'1010' # B'1100';
-- 1000、1110、0110(与、或、异或)
SELECT ~ B'1010', B'1010' << 1, B'1010' >> 1;
-- 0101、0100、0101

&、|、# 的两个位串必须等长;~ 按位取反。位移保持原有长度,移出部分丢弃,空位补零,不是循环移位。需要合并位串而非逐位运算时使用 ||。

长度和访问​

SELECT bit_length(B'1010'), octet_length(B'1010'); -- 4 位、1 字节
SELECT get_bit(B'1010', 0), bit_count(B'1010'); -- 1、2
SELECT set_bit(B'1010', 1, 1); -- 1110
SELECT substring(B'101011' from 2 for 3); -- 010

substring 的起始位置从 1 开始,get_bit 和 set_bit 的偏移从 0 开始,且第 0 位是位串的最左位。bit_count 统计 1 的个数;octet_length 是存储该位串所需的字节数,并不意味着有效位恰好填满这些字节。

使用边界​

类型转换会影响长度,例如把短位串转换成 bit(8) 会补齐,转换成更短的位串会截断;应先确定协议字段宽度再转换。整型与位串转换还涉及有符号整数及高位含义,不能仅根据打印出的 0/1 断言跨系统字节序一致。位标志若要经常独立筛选或加约束,普通布尔列往往更清楚。