我不知道为了翻译%2我必须使用什么指令
#include <iostream>
using namespace std;
int main () {
int number;
cin >> number;
if (number % 2 == 0) { // I cannot translate this part.
cout << "Even\n";
}
else {
cout << "Odd\n";
}
return 0;
}
答案 0 :(得分:6)
在典型的汇编语言中,整数除法指令也会给出余数。在余数除以2的情况下,使用位0转换为逐位AND
要容易得多。例如,关于x86:
mov eax, number
; test sets the flags based on a bitwise and, but discards the result
test eax, 1
mov esi, offset even_string
jz print_it
mov esi, offset odd_string
print_it:
; print string whose base address is in esi
如果你需要通过某个任意数字(而不仅仅是2)检查可除性,则除法指令通常会产生商和余数。再次,使用x86作为演示:
idiv ebx ; divisor in edx:eax
; quotient in eax, remainder in edx
答案 1 :(得分:2)
模数通常由除法指令产生。但是,取模2,4,8,16等是一种特殊情况:因为数字以二进制形式存储,所以可以使用AND
指令完成这些检查。
检查可分性的最快方法是查看值的最低有效位。使用值为AND
的{{1}}指令,即1
。其结果始终与number & 1
相同。大多数现代编译器(以及一些过时的编译器)都可以轻松优化。
对于其他两个权力,number % 2
使用该值减一,即AND
使用x % 4
,x & 3
使用x % 8
,依此类推
答案 2 :(得分:0)
在没有位测试指令的汇编语言中,您必须(布尔)AND值为1:
LODI, R0 #5 ; Load register 0 with the number 5.
ANDI, R0 #1 ; Boolean AND the register with one (1).
JUMZ Value_is_even; jump if the value is zero.
;
; Go here if the value is odd.