Я не думаю, что модуль делает вещи более читабельными. Обе имеют смысл, и обе версии верны. А компьютеры хранят числа в двоичном формате, так что вы можете просто использовать двоичную версию.
Компилятор может заменить версию по модулю более эффективной версией. Но это звучит как оправдание для предпочтения по модулю.
И читаемость в этом особом случае одинакова для обеих версий. Читатель, который плохо знаком с программированием, может даже не знать, что вы можете использовать модуль 2 для определения четности числа. Читатель должен вывести это. Он может даже не знать оператора по модулю !
При выводе значения, стоящего за утверждениями, может быть даже проще прочитать двоичную версию:
if( ( num & 1 ) == 0 ) { /* even */ }
if( ( 00010111b & 1 ) == 0 ) { /* even */ }
if( ( 00010110b & 1 ) == 0 ) { /* odd */ }
(я использовал суффикс "b" только для пояснения, это не C / C ++)
В версии по модулю вы должны дважды проверить, как операция определена в ее деталях (например, проверить документацию, чтобы убедиться, что 0 % 2
- это то, что вы ожидаете).
Двоичный файл AND
проще и нет двусмысленностей!
Только операторский приоритет может быть ловушкой с бинарными операторами. Но это не должно быть причиной, чтобы их избегать (когда-нибудь они понадобятся даже новым программистам).