Bene, per rilevare se un numero è un multiplo di un altro, è sufficiente eseguire x MOD y
. Se il risultato è 0
, allora è un multiplo pari.
È anche vero che per ogni che è una potenza di 2
, (x MOD y)
equivale a (x AND (y - 1))
.
Pertanto:
IF (x AND 3) == 0 THEN
/* multiple of 4 */
EDIT:
ok, volete sapere il motivo per cui (x MOD y) == (x AND (y - 1))
quando y
è una potenza di 2. Farò del mio meglio per spiegare.
Fondamentalmente, se un numero è una potenza di 2, quindi ha un singolo bit impostato (poiché binario è base 2). Ciò significa che tutti i bit più bassi sono disattivati. Ad esempio: 16 == 10000b, 8 == 1000b
, ecc.
Se si sottrae 1 da uno qualsiasi di questi valori. Si finisce con il bit che è stato impostato non impostato e tutti i bit sotto di esso vengono impostati.
15 = 01111b, 7 = 0111b
, ecc. Quindi, in pratica, viene creata una maschera che può essere utilizzata per verificare se è stato impostato uno dei bit inferiori. Spero che sia stato chiaro.
EDIT: commento di Bastien Léonard copre bene anche:
se si divide (non firmato) da 4, si spostare due bit verso destra. Quindi il resto è quei due bit, che ottengono perso quando si divide. 4 - 1 = 11b, ovvero una maschera che produce i due bit più a destra di quando si ERO con un valore .
EDIT: veda questa pagina di spiegazioni possibilmente più chiare: http://en.wikipedia.org/wiki/Power_of_two#Fast_algorithm_to_check_if_a_positive_number_is_a_power_of_two.
Copre rilevare potenze di 2 e con E come un'operazione di modulo veloce se è una potenza di 2.
um, la sua risposta fa uso di manipolazione dei bit, guarda tutta risposta ... – user83255
@ilproxyil, la sua risposta è stato modificato da quando ho commentato. – Mithrax
Sì, stavo spiegando perché è possibile AND con y -1, per ottenere lo stesso valore di MOD y. –