搜尋

首頁  >  問答  >  主體

redis的setbit和getbit是幹嘛的? ? ?

這是我看到的對redisgetbit的講解,感覺講的很到位,可是就是一個也不懂:
不明白這個計算公式,還有,獲取偏移量上的二進位的值有什麼用呢?

GETBIT 指令用於傳回位數組 bitarray 在 offset 偏移量上的二進位位元的值:

GETBIT

GETBIT 指令的執行程序如下:

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

舉個例子, 對於圖 IMAGE_BIT_EXAMPLE 所示的位數組來說, 指令:

GETBIT 3

將執行以下操作:

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

指令的執行過程如圖 IMAGE_SEARCH_EXAMPLE 所示。

digraph { label = "n 圖IMAGE_SEARCH_EXAMPLE 尋找並傳回offset 為3 的二進位位元的過程"; // rankdir = LR; point_to_buf0 [label = "1) 定位到buf[0] 位元組", shape = plaintext]; point_to_idx3 [label = "2) 傳回第4 個二進位位元的值", shape = plaintext]; buf [label = " { buf[0] | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 } | { buf[1] (空字元) } ", shape = record]; // edge [style = dashed]; point_to_buf0 -> buf:buf0; point_to_idx3 -> buf:idx3; }

再舉一個例子, 對於圖 IMAGE_ANOTHER_BIT_EXAMPLE 所示的位元組來說, 指令:

GETBIT 10

將執行以下操作:

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

指令的執行過程如圖 IMAGE_ANOTHER_SEARCH_EXAMPLE 所示。

digraph { label = "n 圖IMAGE_ANOTHER_SEARCH_EXAMPLE 尋找並傳回offset 為10 的二進位位元的過程"; rankdir = LR; // node [shape = record]; buf [label = " { buf[0] | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 } | { buf[1] | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 } | { buf[2] | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 } | { buf[3] | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 } "]; node [shape = plaintext]; point_to_buf [label = "1) 定位到buf[1] 位元組"]; point_to_bit [label = "2) 傳回第3 個二進位位元的值"]; // edge [style = dashed]; point_to_buf -> buf:buf1; point_to_bit -> buf:bit; }

因為 GETBIT 指令執行的所有操作都可以在常數時間內完成, 所以該指令的演算法複雜度為 O(1) 。

我在知乎上看到的這個,相比於上面的感覺挺易懂的https://www.zhihu.com/questio...

天蓬老师天蓬老师2773 天前859

全部回覆(0)我來回復

無回覆
  • 取消回覆