2016-06-01 2 views
0

Обычно я использую n (число)% 2 для проверки четности или нечетности. Недавно я только что открыл другой способ, используя бит мудрый.Судья число нечетное или четное

if(n&1) 
    cout<<"Odd"; 
else 
    cout<<"Even"; 

Бывает ли он быстрее, чем другой? Должен ли я использовать его? Спасибо!

+4

'это быстрее, чем другой? ': Вы сделали какие-то тесты? – 101010

+3

n & 1 должен быть быстрее, так как он проверяет, включен или выключен первый бит в строке bitstring, оператор «%» должен вычислить остальное. – PRDeving

+1

Оставляя, как компилятор действует в этой ситуации, n% 2 потребует операции умножения и вычитания, которые являются дорогостоящими операциями. С другой стороны, & является просто простой и простой операцией. –

ответ

6

Компилятор может очень легко оптимизировать любую операцию в более быструю, поэтому на практике это, вероятно, мало чем отличается.

Я провел этот эксперимент с моим компилятором gcc (5.3 на ubuntu). Учитывая этот код:

#include <iostream> 

int main() 
{ 

    for(int i=0; i<100; ++i) { 
     //if(i % 2 == 0) 
     if(!(i & 1)) 
      std::cout << "i is odd" << std::endl; 
     else 
      std::cout << "i is even" << std::endl; 
    } 
} 

Какой бы из if линий я закомментированными, сборка кода производится в точно так же, а именно:

mov eax, DWORD PTR [rbp-4] # D.35290, i 
and eax, 1 # D.35290, 
test eax, eax # D.35290 

Другими словами, компилятор произвел и версию сравнение в обоих случаях. Это с оптимизацией по умолчанию.

+0

Какой я должен использовать? –

+1

Как указано выше, это не имеет значения. Используйте один из них. Компилятор выберет опцию И, потому что я думаю, что она думает быстрее. – Smeeheey

+0

@ NhânNguyễn Используйте наиболее явные и наиболее используемые формы = = '% 2'. В общем, всегда пишите, что вы хотите сделать, а не трюк, который швы делают то, что вам нужно, но оптимизируют компилятор. Кроме того, трюки часто не переносятся и не поддерживаются – Garf365

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