最近在學習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 0001
。ptr
首先指向dst[0]
,現在我們通過*(ptr++) = 128 | value
把最後七位0000 0001
放到dst[0]
中去,此處發生了截斷,因為*ptr
是uint8_t
型別,而value
是uint32_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 0001
,dst[1]
存放0000 0001
。ok,我們現在從dst[0]
開始取,因為要消去最高位的標識位,所以要和0111 1111
按位與即& 0x7f
,dst[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 ...