Побитовое XOR (^) с булевыми переменными

Я из опыта программирования игр, и я только что наткнулся на побитовое XOR ^. Я видел примеры того, как это работает с целыми числами, но меня немного смущает результат с логическими значениями. Я знаю, что логическое значение равно 0 или 1, но после тестирования мне не удалось воспроизвести результат ^ с помощью простых операторов. Может ли кто-нибудь объяснить мне, что делает следующий фрагмент кода (в частности, ^)? Большое спасибо.

bool body1awake = rigidbody1.isAwake;
bool body2awake = rigidbody2.isAwake;
if (body1awake ^ body2awake)
{
    if (body1awake) rigidbody2.SetAwake();
    else rigidbody1.SetAwake();
}

person Ellie Dunstan    schedule 07.02.2020    source источник
comment
Поищите в Интернете Exclusive Or таблицу истинности.   -  person Thomas Matthews    schedule 08.02.2020


Ответы (2)


Поскольку bool является более узким типом, чем int, оба аргумента неявно преобразуются в int перед вычислением XOR. true принимает значение 1, а false принимает значение 0.

Если этот результат отличен от нуля, то выполняется тело if, и это происходит тогда и только тогда, когда body1awake не равно body2awake.

Так что, возможно, эквивалент

if (body1awake != body2awake)

было бы лучше. Если автор считает, что его способ быстрее, ему нужно серьезно поговорить с оптимизацией компилятора и ввести в разговор правило как если бы.

person Bathsheba    schedule 07.02.2020
comment
Спасибо, я действительно просто слишком много думаю об этом тогда. - person Ellie Dunstan; 07.02.2020
comment
Даже без оптимизации компилятора и правила «как если бы» нет никаких оснований предполагать, что ^ должно быть быстрее, чем != для логических значений. Оба сопоставляются непосредственно с инструкциями по сборке. - person Konrad Rudolph; 07.02.2020
comment
@KonradRudolph это зависит от того, действительно ли bool представлен тем же хранилищем, что и int, или неявное преобразование может иметь стоимость - person Swift - Friday Pie; 07.02.2020

Эксклюзивное или двух битов истинно, когда установлен только один из них. Если оба установлены или не установлены, тогда это ложь. Поскольку bool в основном представляет собой один бит (0 или 1 - его единственные значения)

if (body1awake ^ body2awake)

означает, что условие будет истинным, когда body1awake != body2awake.

person NathanOliver    schedule 07.02.2020
comment
Спасибо. Кажется, я преувеличиваю! - person Ellie Dunstan; 07.02.2020
comment
@EllieDunstan: Нет, программист слишком много думал. if ((body1awake + body2awake) % 2) — это еще один способ написать это. - person Bathsheba; 07.02.2020
comment
@ Вирсавия Ты забыл … != false. - person Konrad Rudolph; 07.02.2020
comment
@EllieDunstan Не беспокойся об этом. Человек, написавший это, должен был оставить комментарий или использовать if (body1awake != body2awake) - person NathanOliver; 07.02.2020
comment
Человек, написавший это, должен купить обед для всей команды разработчиков. - person Bathsheba; 07.02.2020
comment
Месье — знаток извращений. Но это работает и законно - person Swift - Friday Pie; 07.02.2020