2010-07-21 4 views
0
for($i=0;$i<$num;$i++) { 
    if($i==even) $hilite="hilite"; 
    dothing($i,$hilite); 
} 

C'est fondamentalement ce que je veux accomplir. Quel est le moyen le plus efficace de déterminer si $ i est pair? Je sais que je pourrais vérifier si la moitié == mod 2 ... mais cela semble un peu excessif sur les calculs? Y a-t-il un moyen plus simple?modifier une variable basée sur le statut pair/impair d'une autre variable?

Répondre

0

Modifier l'instruction i ++ dans l'instruction loop en i + = 2, de sorte que vous examiniez uniquement les valeurs paires de i?

1

Il ne devient pas plus simple que je% 2 $ == 0. Période.

+0

Si vous modifiez un nombre par 2, le résultat ne sera JAMAIS 2. Il le sera toujours (en supposant que $ i n'est pas négatif pour commencer) soit 0 ou 1. Il devrait lire '$ i% 2 == 0 '. – sigint

+0

Ouch, idiot typo. Bien sûr que tu as raison. – delnan

+0

Oh ouais, c'est toujours une faute de frappe amusante à déboguer ... – sigint

0

Généralement, un nombre est impair s'il est défini sur LSB (Least Significant Bit). Vous pouvez vérifier l'état de ce bit en utilisant le bitwise opérateur AND:

if($testvar & 1){ 
    // $testvar is odd 
}else{ 
// $testvar is even 
} 

Dans votre code ci-dessus, d'une manière plus efficace serait d'avoir $i incrément de 2 dans chaque boucle (en supposant que vous pouvez ignorer les valeurs impaires):

for($i=0;$i<$num;$i+=2){ 
    // $i will always be even! 
} 
1

La syntaxe déjà mentionné % 2 est la plus utilisée et la plus lisible pour d'autres programmeurs. Si vous voulez vraiment éviter un « frais généraux » des calculs:

for($i = 0, $even = true; $i < $num; $i++, $even =! $even) { 
    if($even) $hilite = "hilite"; 
    dothing($i,$hilite); 
} 

Bien que la mission elle-même est probablement plus de travail alors le « % 2 » (qui est en soi un peu de décalage).

Questions connexes