当它不应该时,位移导致零

时间:2014-08-07 02:45:41

标签: go

我正在开发Chip8仿真器。 Chip8指令存储为两个字节对,我将其作为uint16处理。操作码的数据交织在操作码本身中。例如,绘制精灵的操作码是0xDxyn,其中操作码实际上只是0xD000,最后三个位置是要绘制的x和y位置,n是精灵的字节数。

这是介意,我一直试图使用简单的位移和屏蔽来提取这些数据,但我一直得到0而不是预期的值。例如:

//Opcode is = 0xD01F, of type uint16
x := int(c.Registers[((opcode >> 16) & 0x000F)])
y := int(c.Registers[((opcode >> 8) & 0x000F)])
size := int((opcode & 0x000F))

这应该解析为c.Registers [0]和c.Registers [1],而不是两个结束c.Registers [0]。尺寸正确出来15.这是为什么?

1 个答案:

答案 0 :(得分:5)

如果您将16位数字向右移动16位,则表示您已将所有数据移出。

要获得x,您需要移位8位并获得y,4位。 (记住:每个十六进制数字是4位)