二进制位数组

 

简单来说就是一个数组当中的每个项都是一字节长度,每项都保存了8bit二进制。其中这个数组的实现是采用sds字符串对象来实现的。使用sds来逆序保存位数组。 

redis存储二进制数据 redis 二进制_执行过程

 

其中buf[2]的值应该是。

 

getbit命令的实现

作用—用于返回数组在bitarray在offset偏移量上的值。—getbit <array ><offset>

 

执行过程

 

1—先计算,记录offset偏移量在第几个字节。

2—计算,记录在字节的第几个二进制位。

 

setbit命令的实现

作用—将位数组bitarray在offset偏移量上的二进制位的值为value,取值0或1,并向客户端返回之前的旧值。—setbit <array> <offset> <value>

 

执行过程

 

1—计算【offset/8】,记录保存offset指定的值至少要多少字节。

2—检查位数组的长度是否小于len,如果是的话,扩充位数组为len长度,新扩展的位值为0.

3—计算,记录offset偏移量在第几个字节。

4—计算,记录在字节的第几个二进制位。

5—通过byte和bit找到对应的二进制位,将原先的值保存到oldvalue,并将位的值设置为新值

6—返回oldvalue的值。

 

bitcount命令的实现

作用—统计给定的位数组中1的个数。—bitcount <array>

 

统计1的算法

 

遍历—最直接的方法,遍历位数组的每一个二进制位,用计数器记录1的个数,非常低效。

查表算法—通过建立一个表,表的键是位数组的排列方式,值为1的个数。如果要获取为数组中1的个数,直接就能获得。但是因为建立这样的表需要大量的内存,典型的空间换时间,是不允许的。

 

swar算法—目前高效的算法。

 

redis内部是使用了查表和awar算法,前者负责键长为8位的位数组。

 

bitop命令的实现

c语言支持直接进行位与、或、异或、非运算

 

bitop and/or/xor/not result <x> <y>将计算的结果保存到result当中。