BITPOS
Syntax
BITPOS key bit [start [end [BYTE | BIT]]]
- Available since:
- 2.8.7
- Time complexity:
- O(N)
- ACL categories:
-
@read
,@bitmap
,@slow
,
返回字符串中第一个设置为1或0的位的位置。
返回的位置,将字符串视为从左到右的位数组,其中第一个字节的最高有效位位于位置0,第二个字节的最高有效位位于位置8,依此类推。
默认情况下,会检查字符串中包含的所有字节。可以通过传递额外的参数start和end来仅在指定的区间内查找位(也可以只传递start,操作将假设结束位置是字符串的最后一个字节。然而,如后面所解释的,存在语义上的差异)。默认情况下,范围被解释为字节范围而不是位范围,因此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 回复
以下之一:
- Integer reply: 根据请求返回第一个设置为1或0的位的位置
- Integer reply:
-1
. 如果bit
参数为 1 且字符串为空或仅由零字节组成
如果我们寻找设置的位(位参数为1)并且字符串为空或仅由零字节组成,则返回-1。
如果我们寻找清零的位(位参数为0)并且字符串只包含设置为1的位,函数将返回字符串右侧第一个不属于字符串的位。因此,如果字符串是三个字节,值设置为0xff
,命令BITPOS key 0
将返回24,因为直到第23位所有的位都是1。
该函数将字符串的右侧视为用零填充,如果您查找清晰的位并且没有指定范围或仅指定了start参数。
然而,如果您正在寻找清除位并指定了包含start和end的范围,这种行为会发生变化。 如果在指定范围内未找到清除位,函数将返回-1,因为用户指定了一个清除范围,而该范围内没有0位。
历史
- 从 Redis 7.0.0 版本开始:添加了
BYTE|BIT
选项。