您似乎想要操纵 8 位值,提取各种位范围。但是,在某些情况下,您这样做的方式是丢弃所有位。
8 位从最低有效位(位 0,十进制中的“1”)到最高位(位 7,十进制中的“128”)排列。
因此,如果我们有二进制数10010110
,这将表示数字 (128 + 16 + 4 + 2),或 150,或十六进制的 0x96。
如果对这样的数字应用右移,则这些位将向右移动适当数量的位。因此,如果我们对>>4
上面的数字进行处理,结果将是00001001
- 或 9。我假设我们在这里处理的是无符号值,所以高位将用“0”填充。请注意,结果是原来的 4-7 位现在是 0-3 位,而原来的 0-3 位已经被丢弃。
如果你and
有两个数字,结果是只有在两者中设置的位才会在结果中设置。所以有效地这是屏蔽位。如果你用 屏蔽0xf0
,这是二进制11110000
的,所以只有高位 4-7 将保留在结果中,低位 0-3 将被设置为零。
接受你的陈述:
values[(afterfindingpairs[a]&0xf0)>>4]
根据我上面的解释,表达式afterfindingpairs[a]&0xf0
将简单地将位 0-3 设置为零,保留位 4-7。
表达式的下一部分>>4
将把剩余的位向下移动,使它们成为结果的 0-3 位。请注意,这也丢弃了原始位 0-3,使先前的掩码操作变得多余(除非我们不处理 8 位值......)
你的另一个说法:
values[(afterfindingpairs[a]&0xf)>>4]
更有问题。您首先应用掩码 ( 0xf
) 仅保留位 0-3,将所有其他位设置为零。然后,您通过将位 4-7(已经为零)向下移动到它们的位置来应用丢弃位 0-3 的移位。
换句话说,后一个表达式始终为零。