2016-03-22 3 views
1

Я пытался понять Arduino библиотеку «виртуальный провод», и я столкнулся с этим кодом:В чем смысл этого побитового XOR?

static uint8_t vw_ptt_pin = 10; 
static uint8_t vw_ptt_inverted = 0; 

// ... 

void vw_set_ptt_pin(uint8_t pin) 
{ 
    vw_ptt_pin = pin; 
} 

void vw_set_ptt_inverted(uint8_t inverted) 
{ 
    vw_ptt_inverted = inverted; 
} 

// ... 

void vw_tx_start() 
{ 
    // ... 
    digitalWrite(vw_ptt_pin, true^vw_ptt_inverted); 
    // ... 
} 

void vw_tx_stop() 
{ 
    // ... 
    digitalWrite(vw_ptt_pin, false^vw_ptt_inverted); 
    // ... 
} 

Я просто не понимаю, почему он использует true^vw_ptt_inverted и false^vw_ptt_inverted. Вывод этой побитовой операции (целое число) не совпадает с типом ввода функции (логическим). Также, что делать 0^A? Разве это не 0^A==A?

+0

Это просто случайный код. Не пытайтесь понять это, это не имеет никакого смысла. – SergeyA

ответ

3

Обычно vw_tx_start() выходы 1 на порт и vw_tx_stop() выходы 0:

1^0 == 1 
0^0 == 0 

Если вы установили flag vw_ptt_inverted к 1, vw_tx_start() Выведет 0 и vw_tx_stop() 1:

1^1 == 0 
1^0 == 1 

Хотя vw_set_ptt_inverted() должен принять логическое введите или проверьте его ввод, если вы установите флаг на произвольное число, он не будет работать должным образом.

Для типов в C++ логическое выражение может быть неявно преобразовано в int (true => 1, false => 0) и наоборот (non zero => true, zero => false), поэтому логические константы, преобразованные в integer для xor, а затем результат integer преобразован обратно в boolean в соответствии с правилами.

+0

Спасибо! Теперь я понимаю, как работает код, но у меня все еще есть вопрос: Не использует побитовые XOR-избыточные вещи? Не могу ли я использовать '! Vw_ptt_inverted' вместо' true^vw_ptt_inverted' и 'vw_ptt_inverted' вместо' false^vw_ptt_inverted'? –

+0

Вы правы, 'false^vw_ptt_inverted' не имеет никакого смысла. –

+0

@GabrielAguiar да, вы можете, люди, которые программируют встроенную работу с бинарными операциями довольно часто, так выглядит так, для них проще и понятнее – Slava