Целочисленное тестирование на четность (% 2 против & 1) - PullRequest
0 голосов
/ 23 июня 2011

Скомпилированы ли эти два оператора эквивалентно: n% 2 == 0 и n & 1 == 0?

, если нет, еще один эффективный?

Ответы [ 6 ]

3 голосов
/ 23 июня 2011

A аналогичный вопрос был задан вчера.

i % 2 и i & 1 не совпадают:

  • Если ваше целое число не является беззнаковым, в зависимости от его представления, n & 1 не обязательно указывает, является ли ваше целое число четным или нечетным.
  • i % 2 может быть отрицательным.

Для целых чисел без знака хороший компилятор должен разумно создавать одинаково эффективный код.

3 голосов
/ 23 июня 2011

Это зависит от вашего компилятора.

Оптимизирующий компилятор на архитектуре x86 может перевести n % 2 в n & 1, поскольку они эквивалентны для целых чисел дополнения 2s.Другой компилятор на той же платформе или тот же компилятор на другой платформе может дать вам другие результаты.

Я предлагаю использовать n % 2, поскольку это то, чего вы пытаетесь достичь в математических терминахи профилируйте свое приложение перед началом микрооптимизации.

2 голосов
/ 23 июня 2011

Нет, они не всегда дают одинаковый результат.Стандарт C допускает реализации своих дополнений, и в этом случае они будут давать другой результат для отрицательного значения n.

2 голосов
/ 23 июня 2011

Независимо от того, какой из них быстрее, и маловероятно, что это когда-либо будет иметь значение, n % 2 == 0 предпочтительнее, потому что это проясняет ваши намерения.Предпочитайте его по той же причине, по которой вы предпочитаете писать *2 битовым сдвигам.

1 голос
/ 23 июня 2011

Они не будут компилироваться эквивалентно. (На самом деле я должен сказать, что это зависит от компилятора. Но безопаснее предположить, что компиляция будет другой).
(N & 1) является эффективным. (Опять же. Не уверен насчет вещей с порядком байтов, проверим и сообщу.)
Хорошо, проверено на порядке байтов. Это имеет значение с порядком байтов, а не с порядком битов. Поэтому (n & 1) должно быть независимым от платформы.

0 голосов
/ 23 июня 2011

Однажды я написал целочисленную библиотеку произвольной точности на C ++. и%, и & были перегружены так, что они сделали то, что вы ожидаете, только на действительно больших целых. Произвольная точность по модулю очень сложна, в то время как битовые тесты произвольной точности - нет. Из-за этого понимания я всегда предпочитаю (n & 1), так как я знаю, что происходит за кулисами. Конечно, вы можете сказать, что умный компилятор может оптимизировать (n% 2) к тому же набору команд, что и (n & 1), но на самом деле вы имеете в виду «я делаю это неправильно, используя%, и надеюсь, что мой компилятор умнее Я." Не обращайте внимания на комментарии, которые легче понять (n% 2). Оказывается (н & 1) тоже довольно легко понять (ну, может, не для моей бабушки). Используйте &, это правильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...