BITPOS

语法
BITPOS key bit [start [end [BYTE | BIT]]]
可用版本
Redis 开源版 2.8.7
时间复杂度
O(N)
ACL 类别
@read, @bitmap, @slow,

返回字符串中第一个设置为 1 或 0 的位的位置。

返回的位置将字符串视为从左到右的位数组,其中第一个字节的最高有效位在位置 0,第二个字节的最高有效位在位置 8,依此类推。

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

默认情况下,检查字符串中包含的所有字节。可以通过传递附加参数 startend 来仅在指定区间内查找位(也可以只传递 start,操作将假定 end 是字符串的最后一个字节。但正如后面解释的那样,存在语义差异)。默认情况下,范围被解释为字节范围而不是位范围,所以 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 回复

以下之一

  • 整数回复:根据请求返回第一个设置为 1 或 0 的位的位置
  • 整数回复-1。如果 bit 参数为 1 且字符串为空或仅由零字节组成

如果查找已设置的位(bit 参数为 1),并且字符串为空或仅由零字节组成,则返回 -1。

如果查找未设置的位(bit 参数为 0),并且字符串仅包含设置为 1 的位,函数将返回字符串右侧的第一个非字符串位。因此,如果字符串是三个字节,值设置为 0xff,命令 BITPOS key 0 将返回 24,因为直到位 23,所有位都是 1。

如果查找未设置的位且未指定范围或指定了 start 参数,函数会将字符串右侧视为填充了零。

但是,如果查找未设置的位且指定了包含 startend 的范围,此行为会发生变化。如果在指定范围内找不到未设置的位,函数将返回 -1,因为用户指定了一个明确的范围,而该范围内没有 0 位。


历史

  • 从 Redis 7.0.0 版本开始:添加了 BYTE|BIT 选项。
给此页面评分
回到顶部 ↑