よりコンデンス答え:
AAAAAAA G HHHHHHH
パッキング:MySQLのSUM集約関数で使用された場合、すなわち場合
packed = age << 8 | gender << 7 | height
はまたあなただけのコンポーネントを合計することができ
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。実際のIPアドレスとは違って8ビット以上を必要とする256より大きなコンポーネントもあることに注意してください。
まず、最大値を格納するためにどのオフセットを使用する必要があるかを調べる必要があります。 私たちの架空のIPでは、999より大きいコンポーネントはありません。これは、コンポーネントごとに10ビットのストレージが必要であることを意味します(最大1014までの数字を許可します)。
今値
(1 << 10) - 1
は、我々は我々がされている10個の右端のビットを超えた左側のビットを隠すために使用したバイナリマスクである
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
を解凍することができますdec 342682502276
またはbin 100111111001001011110000000010010000100
を与える
packed = (comp1 << 0 * 10) | (comp1 << 1 * 10) | (comp1 << 2 * 10) | (comp1 << 3 * 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 –