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

Это в основном то, что я хочу достичь. Каков наиболее эффективный способ определить, является ли $ i четным? Я знаю, что могу проверить, есть ли половина == mod 2 ... но это кажется немного чрезмерным при расчетах? Есть ли более простой способ?изменить переменную, основанную на четном/нечетном статусе другой переменной?

ответ

0

Измените i ++ в инструкции цикла на i + = 2, чтобы вы рассматривали только значения i?

1

Он не получает проще, чем $ я% 2 == 0. Период.

+0

Если вы измените число на 2, результат будет НИКОГДА не будет 2. Он всегда будет (при условии, что $ i не является отрицательным для начала) либо 0, либо 1. Он должен читать '$ i% 2 == 0 '. – sigint

+0

Ouch, глупые опечатки. Конечно, ты прав. – delnan

+0

О да, это всегда забавная опечатка, которую нужно отлаживать ... – sigint

0

Как правило, число нечетное, если установлено значение LSB (наименьший значащий бит). Вы можете проверить состояние этого бита с помощью bitwise И оператора:

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

В коде выше, более эффективный способ будет иметь $i прирост по 2 в каждом цикле (предполагая, что вы можете игнорировать нечетное значение):

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

уже упомянутые % 2 синтаксис наиболее часто используемый и наиболее читаемый для других программистов. Если вы действительно хотите, чтобы избежать «накладных расходов» расчетов:

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

Хотя само назначение, вероятно, больше работы, то «% 2» (который является по сути лишь немного сдвига).

Смежные вопросы