Я не знаю, какую инструкцию мне нужно использовать для перевода% 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;
}
Modulo обычно создается инструкцией деления. Однако принятие modulo 2, 4, 8, 16 и т.д. Является особым случаем: поскольку числа хранятся в двоичной форме, эти проверки могут выполняться с помощью инструкции AND
.
Самый быстрый способ проверки делимости на 2 - это наименьший значащий бит значения. Используйте команду AND
со значением 1
, то есть number & 1
. Его результат всегда совпадает с number % 2
. Большинство современных компиляторов (и некоторые архаичные) сделают это как легкую оптимизацию.
Для других степеней 2 AND
с этим значением минус единица, т.е. Для x % 4
используйте x & 3
, для x % 8
используйте x & 7
и т.д.
На типичном языке ассемблера инструкция целочисленного деления также даст вам остальную часть. В случае остатка при делении на 2, это намного легче перевести в бит-мудрый AND
с бит 0, хотя. Например, на 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
Если вам нужно проверить делимость на какое-то произвольное число (вместо двух), команда деления обычно производит как частное, так и остальное. Опять же, используя x86 в качестве демонстрации:
idiv ebx ; divisor in edx:eax
; quotient in eax, remainder in edx
В языках ассемблера, которые не имеют битовой тестовой инструкции, вам необходимо (Boolean) И значение с 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.