Проверка чисел на четность

126
20 марта 2021, 21:10

Это можно сделать по разному. Но, все же, какой из нижеперечисленных способов получше с точки зрения читабельности и эффективности? Можете перечислить еще пару способов?

int i{10}, n{};     
// четное ли число?..
cout << boolalpha;
cout << ++n << ".  " << !(i % 2)      << endl  //true
    << ++n << ".  " << (i % 2 == 0)   << endl  //true
    << ++n << ".  " << (~i & 1)       << endl  //1
    << ++n << ".  " << !(i & 1)       << endl  //true
    << ++n << ".  " << ((i & 1) == 0) << endl; //true

И необязательный вопрос: почему в третьем варианте выводится 1 а не true?

Answer 1

При оптимизации все это будет считаться одинаково, а при известном при компиляции i - и вовсе во время компиляции.

И даже при неизвестном при компиляции i будет считаться только один раз - по крайней мере, VC++ именно так и делает, понимая, что все это - записи одного и того же выражения :)

Например, вот такой код

n += !(i % 2);
n += (i % 2 == 0);
n += (~i & 1);
n += !(i & 1);
n += ((i & 1) == 0);

свелся к

not eax
and eax, 1
lea edx, DWORD PTR [rax+rax*4]

Т.е. вычислили один раз через not и and, и умножили на 5 :)

Необязательный ответ - в третьем случае это значение типа int, а в остальных - типа bool...

Answer 2

Каждый программер делает на свой вкус. Вот, пожалуйста :

# include <iostream>
using namespace std ;
template<class T>
static inline   bool oddp(T x){return x bitand 1;}
// и для читаемости
template<class T>
static inline   bool nechetn(T x){return x bitand 1;}
template<class T>
static inline   bool evenp(T x){return not ( x bitand 1 ) ; }
// и для читаемости
template<class T>
static inline   bool chetn(T x){return not ( x bitand 1 ) ; }
int main(){
int i{10}, n{};     
// четное ли число?..
cout << boolalpha;
cout << ++n << ".  " << !(i % 2)      << endl  //true
    << ++n << ".  " << (i % 2 == 0)   << endl  //true
    << ++n << ".  " << (~i & 1)       << endl  //1
    << ++n << ".  " << !(i & 1)       << endl  //true
    << ++n << ".  " << ((i & 1) == 0) << endl //true
        << ++n << ".  " << nechetn(i) << endl
        << ++n << ".  " << chetn(i) << endl;
}

и читаемо , и эффективно.

READ ALSO
Из dupenv собрать путь в filesystem

Из dupenv собрать путь в filesystem

Есть вот такой набросок кода

120
Скрипт не открывается с кнопки при выпуске в Qt

Скрипт не открывается с кнопки при выпуске в Qt

При отладке скрипт запускается и работает При выпуске скрипт не открывается и не выполняется

85
Реализация сигналов и слотов в своём классе

Реализация сигналов и слотов в своём классе

Начал изучать Qt по книге МШлее и дошёл до сигналов и слотов, сам механизм понятен

86
Вычесть из строки подстроку

Вычесть из строки подстроку

Есть строка QString DDF1 с n элементами (устройства USB)

83