Ну, чтобы определить, является ли число кратным другому, вам просто нужно сделать x MOD y
. Если результат равен 0
, то это четное число.
Также верно, что для каждого y
, являющегося степенью 2
, (x MOD y)
эквивалентно (x AND (y - 1))
.
Следовательно:
IF (x AND 3) == 0 THEN
/* multiple of 4 */
ИЗМЕНИТЬ:
хорошо, вы хотите знать, почему (x MOD y) == (x AND (y - 1))
, когда y
является степенью числа 2. Я сделаю все возможное, чтобы объяснить.
По сути, если число представляет собой степень двойки, то оно имеет один набор битов (поскольку двоичное число — это основание 2). Это означает, что все младшие биты не установлены. Так например: 16 == 10000b, 8 == 1000b
и т.д.
Если вычесть 1 из любого из этих значений. В итоге бит, который был установлен, не установлен, а все биты ниже него установлены.
15 = 01111b, 7 = 0111b
и т. д. Таким образом, в основном создается маска, которую можно использовать для проверки того, был ли установлен какой-либо из младших битов. Надеюсь, это было понятно.
EDIT: комментарий Бастьена Леонара также хорошо описывает это:
если вы делите (без знака) на 4, вы сдвигаете два бита вправо. Таким образом, остаток — это те два бита, которые теряются при делении. 4 - 1 = 11b, то есть маска, которая дает два крайних правых бита, когда вы выполняете И со значением.
РЕДАКТИРОВАТЬ: см. эту страницу для более ясных объяснений: http://en.wikipedia.org/wiki/Power_of_two#Fast_algorithm_to_check_if_a_positive_number_is_a_power_of_two.
Он охватывает обнаружение степени двойки и использование И в качестве быстрой операции по модулю, если это степень двойки.
person
Evan Teran
schedule
14.04.2009