Использование побитовых операторов для логических значений в C++
Две основные причины. Короче bitwise-operators говоря, подумайте внимательно; для cxx этого может быть веская причина, но bitwise-operations если в ваших комментариях bitwise-operators есть ОЧЕНЬ явное, потому boolean что это может быть хрупким, и, как cxx вы сами говорите, люди обычно bitwise-operations не привыкли видеть такой boolean код.
Побитовое исключающее ИЛИ != Логическое исключающее ИЛИ (кроме 0 и 1)
Во-первых, если вы работаете boolean со значениями, отличными cxx от false
и true
(или 0
и 1
, как целые cpp числа), оператор ^
может ввести bitwise-operators поведение, не эквивалентное bitwise-operations логическому исключающему cxx ИЛИ. Например:
int one = 1;
int two = 2;
// bitwise xor
if (one ^ two)
{
// executes because expression = 3 and any non-zero integer evaluates to true
}
// logical xor; more correctly would be coded as
// if (bool(one) != bool(two))
// but spelled out to be explicit in the context of the problem
if ((one && !two) || (!one && two))
{
// does not execute b/c expression = ((true && false) || (false && true))
// which evaluates to false
}
Спасибо пользователю boolean @Patrick за первое высказывание.
Порядок операций
Во-вторых, |
, &
и bit-operations ^
, как побитовые операторы, не bit-operations закорачивают. Кроме того, несколько bitwise-operations побитовых операций, объединенных bitwise-operations в цепочку в одном выражении, даже cxx с явными скобками, можно boolean-expression переупорядочить с помощью bitwise-operations оптимизирующих компиляторов, поскольку boolean все три операции обычно являются boolean-expression коммутативными. Это важно, если c++ порядок операций имеет значение.
Другими cpp словами
bool result = true;
result = result && a() && b();
// will not call a() if result false, will not call b() if result or a() false
не всегда будет давать bitwise-operations тот же результат (или конечное boolean-expression состояние), что и
bool result = true;
result &= (a() & b());
// a() and b() both will be called, but not necessarily in that order in an
// optimizing compiler
Это особенно boolean-expression важно, потому что вы можете bit-operations не контролировать методы boolean-expression a()
и b()
, или кто-то другой может cxx прийти и изменить их позже, не bit-operations понимая зависимости, и вызвать bit-operations неприятную (и часто только c++ релиз-сборку) ошибку.
c++
boolean
bitwise-operators
Использование побитовых операторов для логических значений в C++
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.