如上所述,在这里使用mov
和and
是最快的解决方案,但编程的有趣之处在于可以为单个问题找到许多解决方案,因此作为一种效率较低的替代方案,您可以使用以下代码之一。
所以你也可以这样解决:
xor ebx, ebx ; sets ebx = 0
TEST eax, 1 ; is the lowest bit set?
JZ skip_add ; if low bit is zero, skip next instruction
; if lowest bit was set / AND op resulted not zero
add ebx, 1 ; ebx += 1, or use `INC ebx`
skip_add:
; process the result
或者,您也可以使用:
xor ebx, ebx ; ebx = 0
shr eax, 1 ; shift right: lowest bit in carry flag now
adc ebx, 0 ; ebx += 0 + carry bit
shl eax, 1 ; get back original value of eax, `shl` and `or` with ebx
or eax, ebx ; or use `push eax` and `pop eax` instead
另一种选择(类似于其他答案,但成本更高):
push eax
and eax, 1
xchg ebx, eax ; swap contents, could also use `mov` here
pop eax
请注意,这两种解决方案都不会更改 中的值eax
,因此您仍然可以自由使用 eax 中的值。另请注意,注释值用于eax
具有mov eax, 3
问题中使用的 3 值。
如果您已经知道,即ebx
为零,则可以跳过这些xor
行,如果更改eax
无关紧要,您也可以删除该shl
操作。所以实际操作是通过大约两条指令完成的,如您所见。不过,关于 µops,请参阅 Peter 的评论。