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

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