BITPOS
BITPOS key bit [start [end [BYTE | BIT]]]
- 可用版本
- Redis 开源版 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 指定了范围,位位置总是作为从位零开始的绝对值返回。
与 GETRANGE
命令类似,start 和 end 可以包含负值,以便从字符串末尾开始索引字节,其中 -1 是最后一个字节,-2 是倒数第二个字节,依此类推。当指定 BIT
时,-1 是最后一个位,-2 是倒数第二个位,依此类推。
不存在的键被视为空字符串。
示例
redis> SET mykey "\xff\xf0\x00"
OK
redis> BITPOS mykey 0
(integer) 12
redis> SET mykey "\x00\xff\xf0"
OK
redis> BITPOS mykey 1 0
(integer) 8
redis> BITPOS mykey 1 2
(integer) 16
redis> BITPOS mykey 1 2 -1 BYTE
(integer) 16
redis> BITPOS mykey 1 7 15 BIT
(integer) 8
redis> set mykey "\x00\x00\x00"
OK
redis> BITPOS mykey 1
(integer) -1
redis> BITPOS mykey 1 7 -3 BIT
(integer) -1
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
选项。