-1

我有一个纸牌游戏,我需要在洗牌后显示纸牌的价值我使用值显示纸牌的价值(x >> 1)& 0xf,其中 x 遍历 13 张纸牌的列表,这是因为第 1-4 位是纸牌的价值

以上是卡片类型

但是当我发现卡中的最高对时,它只在我使用values[(afterfindingpairs[a]&0xf0)>>4].

这是因为 0-4 位是对数,而 4-7 位是对类型字节中的对值。

当我使用时,它只会将最高对显示为 Ace

values[(afterfindingpairs[a]&0xf)>>4].

我很困惑,十六进制 0xf0 不会处理 8 位而不是 4-7 之间的 4 位对类型,这将被发现values[(afterfindingpairs[a]&0xf)>>4]是不正确的。

非常感谢解释为什么会发生这种情况。

4

1 回答 1

3

您似乎想要操纵 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 的移位。

换句话说,后一个表达式始终为零。

于 2013-03-16T09:40:16.230 回答