Как я могу сказать, является ли число кратным четырем, используя только логический оператор 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:
; ...