BITPOS
BITPOS key bit [start [end [BYTE | BIT]]]
- 可用时间
- 2.8.7
- 时间复杂度
- O(N)
- ACL 类别
-
@read
,@bitmap
,@slow
,
返回字符串中第一个设置为 1 或 0 的位的位号。
位号是从左到右,将字符串视为一个字节数组,其中第一个字节的最高有效位为 0,第二个字节的最高有效位为 8,以此类推。
与 GETBIT
和 SETBIT
命令遵循相同的位号约定。
默认情况下,会检查字符串中包含的所有字节。可以通过传递额外的参数 *start* 和 *end* 来指定只查找指定区间内的位(也可以只传递 *start*,操作会假设 *end* 为字符串的最后一个字节,但存在语义差异,如后文所述)。默认情况下,区间被解释为字节区间,而不是位区间,因此 start=0
和 end=2
表示查看前三个字节。
可以使用可选的 BIT
修饰符指定区间应被解释为位区间。因此 start=0
和 end=2
表示查看前三位。
请注意,即使使用 *start* 和 *end* 指定区间,位号始终返回从 0 开始的绝对值。
与 GETRANGE
命令一样,*start* 和 *end* 可以包含负值,以便从字符串的末尾开始索引字节,其中 -1 为最后一个字节,-2 为倒数第二个字节,以此类推。当指定 BIT
时,-1 为最后一个位,-2 为倒数第二个位,以此类推。
不存在的键被视为空字符串。
示例
RESP2/RESP3 回复
以下之一
如果我们查找设置的位(bit 参数为 1)且字符串为空或仅包含零字节,则返回 -1。
如果我们查找清除的位(bit 参数为 0)且字符串仅包含设置为 1 的位,则函数将返回字符串右侧第一个不属于字符串的位。因此,如果字符串是三个设置为 0xff
值的字节,则命令 BITPOS key 0
将返回 24,因为直到位 23 所有位都为 1。
如果查找清除的位且未指定区间或仅指定 *start* 参数,则函数将字符串右侧视为填充有零。
但是,如果查找清除的位并使用 *start* 和 *end* 指定了区间,则此行为会发生变化。如果在指定区间中找不到清除的位,则函数将返回 -1,因为用户指定了清除区间,而该区间中没有 0 位。
历史记录
- 从 Redis 7.0.0 版本开始:添加了
BYTE|BIT
选项。