正如评论所说,我们将把年龄,性别和身高包装成15位,格式如下:
AAAAAAAGHHHHHHH
从这部分开始:
(age << 8)
要开始,年龄有这种格式:
age = 00000000AAAAAAA
其中每个A可以是0或1。
<< 8将位8移动到左边,并用零填充空位。所以你得到:
(age << 8) = AAAAAAA00000000
类似地:
gender = 00000000000000G
(gender << 7) = 0000000G0000000
height = 00000000HHHHHHH
现在我们要将它们组合成一个变量。 |运算符通过查看每个位进行工作,如果任一输入中的位为1,则返回1。所以:
0011 | 0101 = 0111
如果一个输入中的位为0,则从另一个输入中获取位。看看(年龄<< 8),(性别<< 7)和身高,你会看到,如果其中一个有一个为1,其他人为0。所以:
packed_info = (age << 8) | (gender << 7) | height = AAAAAAAGHHHHHHH
现在我们要打开这些位。我们从高处开始吧。我们想要得到最后的7位,忽略第8位。为此,我们使用&运算符,只有当两个输入位都为1时,它才返回1。所以:
0011 & 0101 = 0001
所以:
packed_info = AAAAAAAGHHHHHHH
0x7F = 000000001111111
(packed_info & 0x7F) = 00000000HHHHHHH = height
为了达到这个年龄,我们可以把所有8个地方都推到右边,剩下0000000AAAAAAAA。所以age =(packed_info>> 8)。
最后,为了获得性别,我们把所有7个地方都放在右边,摆脱高度。然后我们只关心最后一点:
packed_info = AAAAAAAGHHHHHHH
(packed_info >> 7) = 0000000AAAAAAAG
1 = 000000000000001
(packed_info >> 7) & 1 = 00000000000000G