Nun, um festzustellen, ob eine Nummer ein Vielfaches von einem anderen ist, müssen Sie einfach x MOD y
tun. Wenn das Ergebnis 0
ist, dann ist es ein gerades Vielfaches.
Es ist auch wahr, dass für jeden y
, die eine Leistung von 2
ist, (x MOD y)
-(x AND (y - 1))
entspricht.
Deshalb:
IF (x AND 3) == 0 THEN
/* multiple of 4 */
EDIT:
ok, möchten Sie warum(x MOD y) == (x AND (y - 1))
wissen, wann y
eine Potenz von 2 ist, ich mein Bestes tun, um zu erklären.
Wenn eine Zahl eine Potenz von 2 ist, wird ein einzelnes Bit gesetzt (binary ist Base 2). Dies bedeutet, dass alle unteren Bits nicht gesetzt sind. So zum Beispiel: 16 == 10000b, 8 == 1000b
usw.
Wenn Sie 1 von einem dieser Werte subtrahieren. Sie haben am Ende das Bit gesetzt, das nicht gesetzt wurde und alle Bits darunter gesetzt sind.
15 = 01111b, 7 = 0111b
, usw. Also im Grunde ist es erstellt eine Maske, die verwendet werden kann, um zu testen, ob die unteren Bits gesetzt wurden. Ich hoffe, das war klar.
EDIT: Bastien Léonard Kommentar deckt es gut zu:
wenn Sie teilen (unsigned) von 4, zwei Bits nach rechts verschieben . Somit ist der Rest diese zwei Bits, die verloren gehen, wenn Sie teilen. 4 - 1 = 11b, das heißt, eine Maske, die die beiden am weitesten rechts liegenden Bits ergibt, wenn Sie es mit einem Wert UND.
EDIT: sehen Aktualisierung möglicherweise klarer Erklärungen: http://en.wikipedia.org/wiki/Power_of_two#Fast_algorithm_to_check_if_a_positive_number_is_a_power_of_two.
Es umfasst Potenzen von 2 und mit AND als schnelle Modulo-Operation erkennen, ob es sich um eine Potenz von 2
um, seine Antwort Bitmanipulations nicht verwendet, Blick auf die ganze Antwort ... – user83255
@ilproxyil, seine Antwort bearbeitet wurde, da ich kommentiert. – Mithrax
Ja, ich habe erklärt, warum Sie UND mit y -1 können, um den gleichen Wert wie MOD y zu erhalten. –