Как правильно определить, имеют ли два числа одинаковую четность?

Я нашел два решения, чтобы выяснить, имеют ли два числа одинаковую четность (оба нечетные числа или оба четные). В C ++ они выглядят так:

if ((a+b)%2 == 0)

а также

if (a%2 == b%2)

Проблема в том, что первый работает в 100% случаев, а второй только в 80% случаев (тесты проблемы, которые я представил на веб-сайте), и я не понимаю, почему. Для меня обе строки кода должны нормально работать во всех случаях. Может кто-нибудь объяснить мне, почему первая строка кода работает во всех случаях, а вторая — нет? И какой метод (показанный мной или другим) вы бы порекомендовали?

2

Решение

Я не рекомендовал бы ни один из методов в вашем посте, вы должны использовать один из них:

if ((a & 1) == (b & 1)) {} // this is clearer

if (((a ^ b) & 1) == 0) {} // this is faster

if (!((a ^ b) & 1)) {}     // this is as fast as faster

Они зависят от того факта, что бит 0 будет установлен для нечетных значений, даже если они отрицательные. По возможности избегайте целочисленного деления (и по модулю), это одна из самых медленных инструкций на любом процессоре.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]