更凝結答案:
AAAAAAA摹HHHHHHH
包裝:
packed = age << 8 | gender << 7 | height
另外,如果即MySQL的SUM聚合函數中使用時,你可以總結組件
packed = age << 8 + gender << 7 + height
開箱:
age = packed >> 8 // no mask required
gender = packed >> 7 & ((1 << 1) - 1) // applying mask (for gender it is just 1)
height = packed & ((1 << 7) - 1) // applying mask
另一個(長)例如:
說你必須要打包的IP地址,但它是一個虛構的IP地址,例如 132.513.151.319。請注意,一些大於256的組件需要8位以上的真實IP地址。
首先,我們需要弄清楚我們需要使用什麼補償來存儲最大數量。 可以說我們虛構的IP沒有組件可以大於999,這意味着我們需要每個組件10位存儲空間(允許數字高達1014)。
packed = (comp1 << 0 * 10) | (comp1 << 1 * 10) | (comp1 << 2 * 10) | (comp1 << 3 * 10)
其中給出dec 342682502276
或bin 100111111001001011110000000010010000100
現在讓我們來解開值
comp1 = (packed >> 0 * 10) & ((1 << 10) - 1) // 132
comp2 = (packed >> 1 * 10) & ((1 << 10) - 1) // 513
comp3 = (packed >> 2 * 10) & ((1 << 10) - 1) // 151
comp4 = (packed >> 3 * 10) & ((1 << 10) - 1) // 319
哪裏(1 << 10) - 1
是我們用來躲就保留超出10最右位我們是位二進制掩碼感興趣。
使用MySQL查詢的同樣例子
SELECT
(@offset := 10) AS `No of bits required for each component`,
(@packed := (132 << 0 * @offset) |
(513 << 1 * @offset) |
(151 << 2 * @offset) |
(319 << 3 * @offset)) AS `Packed value (132.513.151.319)`,
BIN(@packed) AS `Packed value (bin)`,
(@packed >> 0 * @offset) & ((1 << @offset) - 1) `Component 1`,
(@packed >> 1 * @offset) & ((1 << @offset) - 1) `Component 2`,
(@packed >> 2 * @offset) & ((1 << @offset) - 1) `Component 3`,
(@packed >> 3 * @offset) & ((1 << @offset) - 1) `Component 4`;
我認爲這是值得一問這個問題之前閱讀二進制數表示和位運算符。 –
在評論中的圖片幾乎說這一切:AAAAAAA G HHHHHHH –