leveldb varint 講解和實現

2021-10-14 05:55:09 字數 3343 閱讀 7010

最近在學習leveldb,遇到varint這種資料結構,本來想直接看網上的解析,然而網上的解析都千篇一律,都是貼**讓自己去看。好不容易弄懂之後決定把思考過程貼出來,方便大家學習。

leveldb中為了減少記憶體占用,使用了varint這一資料結構,把數字放到字元陣列中來表示,思想就是把小數字用盡量少的位元組來表示,每個位元組只使用其中的7位,最高位用來表示是否還有剩餘的數字,0代表沒有,1代表有。

下面是encode的**

#include

#include

#include

char

*encode_varint32

(char

*dst,

uint32_t value)

else

if(value

<<14)

)else

if(value

<<21)

)else

if(value

<<28)

)else

return

reinterpret_cast

<

char

*>

(ptr)

;}

首先把字元陣列轉為uint8_t型別的陣列,這樣我們接下來才能表示數字。可以看到,在判斷語句中對數字所需要的位數進行了判斷,如果可以用7個位來表示,那就直接賦值,如果可以用14個位來表示(剩下兩位要用來表示數字是否結束),那就把數字的前7位放到dst[0]中,在把剩餘的7位右移,放到dst[1]中去。如果可以用21個位來表示,那麼前七個位放到dst[0],中間七位放到dst[1],最後七位放到dst[2]

舉例說來,假設我們的dst是乙個長度位5的字元陣列,value等於129。那麼dst在記憶體空間中是這樣表示的dst[4] dst[3] dst[2] dst[1] dst[0],每個佔據8位,value的二進位制表示為0000 0000 1000 0001ptr首先指向dst[0],現在我們通過*(ptr++) = 128 | value把最後七位0000 0001放到dst[0]中去,此處發生了截斷,因為*ptruint8_t型別,而valueuint32_t,所以只會把value的最後七位放到dst[0]中去,放完之後dst[0]等於1000 0001,注意此處最高位的1並不是數字,而是代表數字沒有結束,要繼續操作。接下來我們把中間七位00 0000 1放到dst[1]中去,首先右移七位得到0000 0001,然後直接賦值即可。

void

decode_varint32

(const

char

*src,

/*const char *limit,*/

uint32_t

*value)

if(shift <=28)

}

decode就是encode的逆過程,每次從陣列中拿出七位,移位到最終的位置後與結果按位或,直到位元組的最高位為0代表結束即可。

舉例說來,剛才我們把129放到了dst中,現在dst的內容是:dst[0]存放1000 0001dst[1]存放0000 0001。ok,我們現在從dst[0]開始取,因為要消去最高位的標識位,所以要和0111 1111按位與即& 0x7fdst[0]代表最後七位,移位0位即可,現在我們的*value等於1。接下來對dst[1]進行迴圈條件判斷,一位內dst[1]=0000 0001不符合條件,進入最後的if語句,在這裡我們接著取dst[1]的內容,因為dst[1]中存放中間七位,我們取出資料後消去標誌位,然後左移七位得到1000 0000,然後與剛才的結果按位或得到最終結果129。

這裡我對leveldb中的**(原始碼見getvarint32pt***llback)做了些改動,看起來更簡潔一些,另外我覺得leveldb中的const char *dst是不必要的,因為已經有了最高位來判斷數字是否結束,當然,我們寫**的時候最好還是加上,更嚴格的控制條件並沒什麼不好,相反可能還會有好處,這裡只是提供乙個另外的思路。

void的講解 any的講解 聯合型別的講解

1.void的使用空值一般採用 void 來表示,同時void也可以表示變數 也可以表示函式沒有返回值哈 使用了 void 就不能夠使用 return 哈 let sum function void 使用了 void 就不能夠使用 return 哈2.void 可以修飾 underfined 和 n...

array,vector 的講解,迭代器講解

2.array,vector 的講解 2.1array的詳細講解 靜態陣列 include include include includeusing namespace std void main 建立一維包含5個元素的整形陣列 arraymyint2 建立一維包含5個元素的整形陣列 arraymy...

svm通俗講解 SVM通俗講解

svm support vector machine 支援向量機相關理論介紹 基於資料的機器學習是現代智慧型技術中的重要方面,研究從觀測資料 樣本 出發尋找規律,利用這些規律對未來資料或無法觀測的資料進行 迄今為止,關於機器學習還沒有一種被共同接受的理論框架,關於其實現方法 大致可以分為 三種 3 ...