用 0xFFFF 屏蔽 16 位值
Masking a 16-bit value with 0xFFFF
我正在关注 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 位程序计数器寄存器, 65535
十六进制是 0xFFFF
,用 0xFFFF
屏蔽 16 位值的目的是什么?据我所知这没有任何作用?还是跟符号位有关?
我认为重要的部分是您使用 JavaScript - 它只有一种数字类型 - 浮点数。但显然底层引擎可以识别何时应该使用整数 - 使用位掩码强烈建议我们将其用作整数,因为位操作通常对浮点数没有意义。它还将这个特定变量中所有使用的坑修剪为最后 16 个——你有什么保证早些时候它没有使用比最后 16 个更旧的位?如果所有后续操作都假设数字是 16 位,那么如果不使用掩码,您的假设很容易被打破。
简短的回答:它会丢弃除低 16 位以外的所有位。这样,当 运行 在 32/64 位机器上时,您将丢弃所有其他机器。
JS 使用 >16 位,为了确保您只使用 16 位,您通过与 0xFFFF
(或 65535)进行与运算来丢弃其余部分。在此特定示例中,程序计数器在游戏机上为 16 位(显然是 :P ),当值达到 65536 时,'wrapped around' 变为 0。if (Z80._r.pc > 65535) Z80._r.pc = 0
会做同样的事情,但会 可能表现更差。这种"trick"在位操作代码中用的很频繁
what is the purpose of masking a 16-bit value
None。但是没有 16 位值 - 它只是 javascript 中的一个(浮点)数字。仅 使其模拟 一个 16 位值,此数字在程序计数器递增后被削减为 16 位 - 它没有从 ++
溢出,但只是取值65536.
这也是评论所说的:// Mask PC <b><i>到</i></b> 16位
。
我正在关注 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 位程序计数器寄存器, 65535
十六进制是 0xFFFF
,用 0xFFFF
屏蔽 16 位值的目的是什么?据我所知这没有任何作用?还是跟符号位有关?
我认为重要的部分是您使用 JavaScript - 它只有一种数字类型 - 浮点数。但显然底层引擎可以识别何时应该使用整数 - 使用位掩码强烈建议我们将其用作整数,因为位操作通常对浮点数没有意义。它还将这个特定变量中所有使用的坑修剪为最后 16 个——你有什么保证早些时候它没有使用比最后 16 个更旧的位?如果所有后续操作都假设数字是 16 位,那么如果不使用掩码,您的假设很容易被打破。
简短的回答:它会丢弃除低 16 位以外的所有位。这样,当 运行 在 32/64 位机器上时,您将丢弃所有其他机器。
JS 使用 >16 位,为了确保您只使用 16 位,您通过与 0xFFFF
(或 65535)进行与运算来丢弃其余部分。在此特定示例中,程序计数器在游戏机上为 16 位(显然是 :P ),当值达到 65536 时,'wrapped around' 变为 0。if (Z80._r.pc > 65535) Z80._r.pc = 0
会做同样的事情,但会 可能表现更差。这种"trick"在位操作代码中用的很频繁
what is the purpose of masking a 16-bit value
None。但是没有 16 位值 - 它只是 javascript 中的一个(浮点)数字。仅 使其模拟 一个 16 位值,此数字在程序计数器递增后被削减为 16 位 - 它没有从 ++
溢出,但只是取值65536.
这也是评论所说的:// Mask PC <b><i>到</i></b> 16位
。