codecamp

Redis GETBIT命令的实现

GETBIT 命令用于返回位数组 bitarray 在 offset 偏移量上的二进制位的值:

GETBIT <bitarray> <offset>

GETBIT 命令的执行过程如下:

  1. 计算 byte = \lfloor offset \div 8 \rfloor , byte 值记录了 offset 偏移量指定的二进制位保存在位数组的哪个字节。
  2. 计算 bit = (offset \bmod 8) + 1 , bit 值记录了 offset 偏移量指定的二进制位是 byte 字节的第几个二进制位。
  3. 根据 byte 值和 bit 值, 在位数组 bitarray 中定位 offset 偏移量指定的二进制位, 并返回这个位的值。

举个例子, 对于图 IMAGE_BIT_EXAMPLE 所示的位数组来说, 命令:

GETBIT <bitarray> 3

将执行以下操作:

  1. \lfloor 3 \div 8 \rfloor 的值为 0 。
  2. (3 \bmod 8) + 1 的值为 4 。
  3. 定位到 buf[0] 字节上面, 然后取出该字节上的第 4 个二进制位(从左向右数)的值。
  4. 向客户端返回二进制位的值 1 。

命令的执行过程如图 IMAGE_SEARCH_EXAMPLE 所示。

再举一个例子, 对于图 IMAGE_ANOTHER_BIT_EXAMPLE 所示的位数组来说, 命令:

GETBIT <bitarray> 10

将执行以下操作:

  1. \lfloor 10 \div 8 \rfloor 的值为 1 。
  2. (10 \bmod 8) + 1 的值为 3 。
  3. 定位到 buf[1] 字节上面, 然后取出该字节上的第 3 个二进制位的值。
  4. 向客户端返回二进制位的值 0 。

命令的执行过程如图 IMAGE_ANOTHER_SEARCH_EXAMPLE 所示。

因为 GETBIT 命令执行的所有操作都可以在常数时间内完成, 所以该命令的算法复杂度为 O(1) 。

Redis 重点回顾
Redis 重点回顾
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }