Понимание побитового XOR (^) с логическими переменными - PullRequest
2 голосов
/ 07 февраля 2020

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

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

Ответы [ 2 ]

3 голосов
/ 07 февраля 2020

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

if (body1awake ^ body2awake)

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

1 голос
/ 07 февраля 2020

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

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

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

if (body1awake != body2awake)

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

...