我试图理解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_inverted
和false ^ vw_ptt_inverted
的原因。此按位运算的输出(整数)与函数输入的类型(布尔值)不匹配。做0 ^ A
的重点是什么?不是0^A==A
?
答案 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运算的整数,然后根据规则将结果整数转换回布尔值。