Существует несколько способов выполнить этот тест:
Тернарный оператор может генерировать дорогостоящие скачки:
if ((flags & AMAZING_FLAG) != (doSet ? AMAZING_FLAG : 0))
Вы также можете использовать логическое преобразование, которое может быть или не быть эффективным:
if (!!(flags & AMAZING_FLAG) != doSet)
Или эквивалентная ему альтернатива:
if (((flags & AMAZING_FLAG) != 0) != doSet)
Если умножение дешево, вы можете избежать переходов с помощью:
if ((flags & AMAZING_FLAG) != doSet * AMAZING_FLAG)
Если flags
не подписано и компилятор очень умный, приведенное ниже деление может скомпилировать простой сдвиг:
if ((flags & AMAZING_FLAG) / AMAZING_FLAG != doSet)
Если в архитектуре используется арифметика с двумя дополнениями c, здесь есть другая альтернатива:
if ((flags & AMAZING_FLAG) != (-doSet & AMAZING_FLAG))
Альтернативно, можно определить flags
как структуру с битовыми полями и использовать намного более простой читаемый синтаксис:
if (flags.amazing_flag != doSet)
Увы, этот подход обычно не одобряется, потому что спецификация битовых полей не позволяет точно контролировать реализация на уровне битов.