使用0xFFFF屏蔽16位值

时间:2015-03-01 11:17:37

标签: javascript masking bits 16-bit

我正在关注Gameboy仿真的guide,在一段代码中我看到了以下内容:

while(true) 
{ 
  var op = MMU.rb(Z80._r.pc++); // Fetch instruction 
  Z80._map[op]();               // Dispatch 
  Z80._r.pc &= 65535;           // Mask PC to 16 bits 
  Z80._clock.m += Z80._r.m;     // Add time to CPU clock 
  Z80._clock.t += Z80._r.t; 
}

当pc是16位程序计数器寄存器且十六进制655350xFFFF时,使用0xFFFF屏蔽16位值的目的是什么?据我所知,这什么都没做?或者它与符号位有关吗?

3 个答案:

答案 0 :(得分:3)

我认为重要的是你使用JavaScript - 它只有一个数字类型 - 浮点。但显然底层引擎可以识别何时应该使用整数 - 使用位掩码强烈建议我们将其用作整数,因为位操作通常对浮点数没有意义。它还将这个特定变量中所有已使用的凹坑修剪为16 - 这保证你早先没有使用比过去16更早的位?如果所有后来的操作都假设数字是16位,那么不使用掩码,你的假设很容易破坏。

答案 1 :(得分:2)

简短的回答:除了16位低位之外,它会丢弃所有位。这样,当在32/64位机器上运行时,您将丢弃所有其他机器。

JS使用> 16位并确保您只使用16位,只需通过与0xFFFF(或65535)进行AND运算来丢弃其余部分。在这个特定的例子中,程序计数器,在游戏男孩(显然是P)上是16位,被包裹在'值达到65536时为0. if (Z80._r.pc > 65535) Z80._r.pc = 0会执行相同操作,但可能表现更差。这种"技巧"在位操作代码中经常使用。

答案 2 :(得分:2)

  

屏蔽16位值的目的是什么

无。但是没有16位值 - 它只是javascript中的一个(浮点)数字。只有使其模拟一个16位值,在程序计数器递增后,该数字减少到16位 - 它不会从++溢出,而只是取值65536。 / p>

这也是评论所说的:// Mask PC to 16 bits