这个按位XOR有什么意义?

时间:2016-03-22 13:23:36

标签: c++ arduino bit-manipulation bitwise-operators xor

我试图理解arduino库“虚拟线”,我遇到了这段代码:

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_invertedfalse ^ vw_ptt_inverted的原因。此按位运算的输出(整数)与函数输入的类型(布尔值)不匹配。做0 ^ A的重点是什么?不是0^A==A

1 个答案:

答案 0 :(得分: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()应接受布尔类型或检查它的输入,但如果将flag设置为任意数字,它将无法正常工作。

对于类型,在C ++中,boolean可以隐式转换为int(true => 1,false => 0),反之亦然(非零=> true,zero => false),因此转换为布尔常量到xor运算的整数,然后根据规则将结果整数转换回布尔值。