Как я могу сказать, является ли число кратным четырем, используя только логический оператор AND?

Я возлюсь с программированием на ассемблере, и мне любопытно, как я могу сказать, является ли число кратным 4 с помощью логического оператора и?

Я знаю, как это сделать, используя инструкции "div" или "остаток", но я пытаюсь сделать это с битовой манипуляцией числом/словом.

может ли кто-нибудь указать мне в правильном направлении? Я использую MIPs, но языковой агностический ответ в порядке.

4 ответов


ну, чтобы определить, является ли число кратным другому, вам просто нужно сделать x MOD y. Если результат 0, тогда это четное число.

это также верно, что для каждого y что это 2, (x MOD y) эквивалентно (x AND (y - 1)).

таким образом:

IF (x AND 3) == 0 THEN
    /* multiple of 4 */

EDIT:

хорошо, вы хотите знать почему (x MOD y) == (x AND (y - 1)), когда y сила 2. Я сделаю все возможное, чтобы объяснять.

в основном, если число имеет степень 2, то оно имеет один битный набор (так как двоичный является базой 2). Это означает, что все нижние биты не заданы. Так например: 16 == 10000b, 8 == 1000b, etc.

если вычесть 1 из любого из этих значений. Вы в конечном итоге бит, который был установлен, не установлен, и все биты ниже него установлены.

15 = 01111b, 7 = 0111b, etc. Таким образом, в основном он создает маску, которая может быть использована для проверки, были ли установлены какие-либо из нижних битов. Я надеюсь, что это было четкий.

EDIT: комментарий Бастьена Леонара также хорошо охватывает его:

если вы делите (без знака) на 4, Вы сдвиг на два бита вправо. Таким образом остаток - это те два бита, которые получают потерян, когда ты разделяешься. 4 - 1 = 11в, то есть маска, которая дает два самые правые биты, когда ты и она с значение.

EDIT: см. эту страницу для возможно более ясных объяснений: http://en.wikipedia.org/wiki/Power_of_two#Fast_algorithm_to_check_if_a_positive_number_is_a_power_of_two.

оно покрывает обнаруживать силы 2 и использования и как быстрая деятельность по модулю если сила 2.


(x & 3) == 0

W. r.т. язык сборки, используйте TST, если доступно, в противном случае и, и проверьте нулевой флаг.


число кратно 4, если его нижние 2 бита равны 0, поэтому вы можете просто сдвинуть число вправо дважды и проверить сдвинутые биты на 0.


в сборке x86:

    test eax, 3
    jnz not_multiple_of_4

    ; action to be taken if EAX is a multiple of 4

not_multiple_of_4:
    ; ...