Использование побитовых операторов для логических значений в 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

2022-09-02T15:50:28+00:00