本文内容为 http://redis.io/commands/bitpos 的翻译、注解、例子扩充及其它修改。感谢 Redis 作者 Antirez 为开源社区作出的贡献,本文保证最新、最准、最全以表示对其的敬意。欢迎留言纠错、提示更新或支持。
BITPOS key bit [start] [end]

返回键 key 对应的字符串值中第一个被设置为 10 的位(Bit)的位置。

Return the position of the first bit set to 1 or 0 in a string.

命令执行时,会将该字符串当成由从左至右所有位(Bit)组成的数组,即第 1 字节(Byte)的最高位(Significant bit)在位置 0 处,而第 2 字节的最高位在位置 8 处,以此类推。

The position is returned thinking at the string as an array of bits from left to right where the first byte most significant bit is at position 0, the second byte most significant big is at position 8 and so forth.

命令 GETBITSETBIT 遵守同样的位(Bit)位置规则。

默认地,包含在字符串中的所有字节都将被检测。

当然,也可以通过指定附加参数 startend 来确定一个区间以用于查找位。

By default all the bytes contained in the string are examined. It is possible to look for bits only in a specified interval passing the additional arguments start and end (it is possible to just pass start, the operation will assume that the end if the last byte of the string. However there are semantical differences as explained later). The range is interpreted as a range of bytes and not a range of bits, so start=0 and end=2 means to look at the first three bytes.

Note that bit positions are returned always as absolute values starting from bit zero even when start and end are used to specify a range.

Like for the GETRANGE command start and end can contain negative values in order to index bytes starting from the end of the string, where -1 is the last byte, -2 is the penultimate, and so forth.

不存在的键将被视为空字符串。

Non-existent keys are treated as empty strings.
  • 返回键 key 对应的字符串值中第一个被设置为 1 或 0 的位(Bit)的位置。

    具体:

    The command returns the position of the first bit set to 1 or 0 according to the request.

    If we look for set bits (the bit argument is 1) and the string is empty or composed of just zero bytes, -1 is returned.

    If we look for clear bits (the bit argument is 0) and the string only contains bit set to 1, the function returns the first bit not part of the string on the right. So if the string is tree bytes set to the value 0xff the command BITPOS key 0 will return 24, since up to bit 23 all the bits are 1.

    Basically the function consider the right of the string as padded with zeros if you look for clear bits and specify no range or the start argument only.

    However this behavior changes if you are looking for clear bits and specify a range with both start and end. If no clear bit is found in the specified range, the function returns -1 as the user specified a clear range and there are no 0 bits in that range.

  • 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 1
    (integer) 8
    redis> set mykey "\x00\x00\x00"
    OK
    redis> BITPOS mykey 1
    (integer) -1
  • 版本支持

    2.8.7+

    时间复杂度(Time complexity)

    O(N)