我有一个纸牌游戏,我需要在洗牌后显示卡的价值我使用值(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位不正确。
对于为什么会发生这种情况的解释将非常感激。
答案 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位的移位。
换句话说,后一个表达式始终为零。