Go 位移位,当它不应';T

Go 位移位,当它不应';T,go,Go,我正在开发一个芯片8模拟器。Chip8指令存储为两个字节对,我将其作为uint16处理。操作码的数据与操作码本身交织在一起。例如,绘制精灵的操作码是0xDxyn,其中操作码实际上只是0xD000,最后三位是要绘制的x和y位置,n是精灵的字节数 这就是我的想法,我一直在尝试使用简单的位移位和掩蔽来提取这些数据,但我一直得到0而不是预期的值。例如: //Opcode is = 0xD01F, of type uint16 x := int(c.Registers[((opcode >>

我正在开发一个芯片8模拟器。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.寄存器[0]和c.寄存器[1],而不是以c.寄存器[0]结尾。大小正确。这是为什么?

如果将一个16位的数字向右移动16个位置,则表示已将所有数据移出


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

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


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

出于某种原因,我在脑海中为每个十六进制数字移动8位。真是个傻瓜。不知什么原因,我脑子里想的是每个十六进制数字换8个位置。真是个笨蛋。