Protobuf序列化的原理-负数的存储
生活随笔
收集整理的這篇文章主要介紹了
Protobuf序列化的原理-负数的存储
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在計算機中,負數會被表示為很大的整數,因為計算機定義負數符號位為數字的最高位,所以如果采用varint編碼表示一個負數,那么一定需要5個比特位。所以在protobuf中通過sint32/sint64類型來表示負數,負數的處理形式是先采用zigzag編碼(把符號數轉化為無符號數),在采用
varint編碼。
sint32:(n << 1) ^ (n >> 31)
sint64:(n << 1) ^ (n >> 63)?
比如存儲一個(-300)的值
-300
原碼:0001 0010 1100
取反:1110 1101 0011
加1?:1110 1101 0100
n<<1:?整體左移一位,右邊補0?-> 1101 1010 1000
n>>31:?整體右移31位,左邊補1?-> 1111 1111 1111?
n<<1 ^ n >>31
1101 1010 1000 ^ 1111 1111 1111 = 0010 0101 0111
十進制:?0010 0101 0111 = 599
varint算法:?從右往做,選取7位,高位補1/0(取決于字節數)
得到兩個字節
1101 0111 0000 0100
-41?、?4
?
總結
以上是生活随笔為你收集整理的Protobuf序列化的原理-负数的存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Protobuf序列化的原理-存储格式
- 下一篇: Protobuf序列化的原理-总结