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,依此类推。

相同的位位置约定由GETBITSETBIT遵循。

默认情况下,会检查字符串中包含的所有字节。可以通过传递额外的参数startend来仅在指定的区间内查找位(也可以只传递start,操作将假设结束位置是字符串的最后一个字节。然而,如后面所解释的,存在语义上的差异)。默认情况下,范围被解释为字节范围而不是位范围,因此start=0end=2意味着查看前三个字节。

你可以使用可选的BIT修饰符来指定范围应被解释为位的范围。 因此start=0end=2意味着查看前三位。

请注意,即使使用startend来指定范围,位位置也始终作为从零位开始的绝对值返回。

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参数。

然而,如果您正在寻找清除位并指定了包含startend的范围,这种行为会发生变化。 如果在指定范围内未找到清除位,函数将返回-1,因为用户指定了一个清除范围,而该范围内没有0位。


历史

  • 从 Redis 7.0.0 版本开始:添加了 BYTE|BIT 选项。
RATE THIS PAGE
Back to top ↑