Использование побитовых операторов для логических значений в C++
Две основные причины. Короче c++ говоря, подумайте внимательно; для bitwise-operations этого может быть веская причина, но bool если в ваших комментариях c++ есть ОЧЕНЬ явное, потому cpp что это может быть хрупким, и, как bitwise-operations вы сами говорите, люди обычно bitwise-operations не привыкли видеть такой c++ код.
Побитовое исключающее ИЛИ != Логическое исключающее ИЛИ (кроме 0 и 1)
Во-первых, если вы работаете bitwise-operations со значениями, отличными c++ от false
и true
(или 0
и 1
, как целые bitwise-operations числа), оператор ^
может ввести c++ поведение, не эквивалентное boolean-expression логическому исключающему bitwise-operators ИЛИ. Например:
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-expression @Patrick за первое высказывание.
Порядок операций
Во-вторых, |
, &
и bool ^
, как побитовые операторы, не bool закорачивают. Кроме того, несколько boolean-expression побитовых операций, объединенных bitwise-operators в цепочку в одном выражении, даже c++ с явными скобками, можно cpp переупорядочить с помощью bool оптимизирующих компиляторов, поскольку bitwise-operators все три операции обычно являются bitwise-operators коммутативными. Это важно, если cxx порядок операций имеет значение.
Другими boolean словами
bool result = true;
result = result && a() && b();
// will not call a() if result false, will not call b() if result or a() false
не всегда будет давать bool тот же результат (или конечное cxx состояние), что и
bool result = true;
result &= (a() & b());
// a() and b() both will be called, but not necessarily in that order in an
// optimizing compiler
Это особенно bitwise-operators важно, потому что вы можете bool не контролировать методы boolean a()
и b()
, или кто-то другой может bitwise-operations прийти и изменить их позже, не boolean-expression понимая зависимости, и вызвать boolean неприятную (и часто только bit-operations релиз-сборку) ошибку.
c++
boolean
bitwise-operators
Использование побитовых операторов для логических значений в C++
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.