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