使用C中的位显示卡的值

时间:2013-03-16 07:43:02

标签: c bit-manipulation bit bit-shift

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

以上是卡片类型

但是当我遇到卡片中找到最高的一对时,只有在我使用values[(afterfindingpairs[a]&0xf0)>>4]时才有效。

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

当我使用

时,它只显示最高的一对作为Ace

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

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

对于为什么会发生这种情况的解释将非常感激。

1 个答案:

答案 0 :(得分:2)

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

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