2016-03-22 51 views
1

Ben arduino kitaplığı "sanal tel" anlamaya çalışıyordum ve bu kodun koştu: o true^vw_ptt_inverted ve false^vw_ptt_inverted kullandığı Sadece neden alamadımBu bitsel XOR'un noktası nedir?

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); 
    // ... 
} 

. Bu bitsel işlemin (tamsayı) çıktısı, işlevin girişiyle (boolean) eşleşmiyor. Ayrıca 0^A yapmanın amacı nedir? 0^A==A değil mi? Normalde

+0

Bu sadece rastgele bir koddur. Anlamaya çalışma, hiçbir anlam ifade etmiyor. – SergeyA

cevap

3

vw_tx_start() portuna çıkışları 1 ve vw_tx_stop() çıkışları 0:

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

Eğer flag vw_ptt_inverted-1, vw_tx_start() irade çıkışı 0 ile vw_tx_stop() 1 ayarlarsanız:

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

vw_set_ptt_inverted() rağmen boole kabul etmelidir Girdiyi yazıp işaretleyin, eğer isteğe bağlı numarayı işaretlerseniz, düzgün çalışmaz.

C++ boolean türlerinde, dolaylı olarak int (true => 1, false => 0) ve tam tersi (true => true, zero => false) türlerine dönüştürülebilir, böylece boole sabitleri tamsayıya dönüştürülür. xor işlemi ve daha sonra sonuç tamsayı kurallara göre tekrar boole dönüştürülür.

+0

Teşekkürler! Şimdi kodun nasıl çalıştığını anlıyorum, ancak hala bir sorum var: Bitsel XOR aşırı karmaşık şeyler kullanmıyor mu? Sadece 'false^vw_ptt_inverted' yerine' true^vw_ptt_inverted' ve 'vw_ptt_inverted' yerine' vw_ptt_inverted' kullanamazmıyım? –

+0

Haklısınız, 'false^vw_ptt_inverted' herhangi bir anlam ifade etmiyor. –

+0

@GabrielAguiar evet yapabilirsin, ikili çalışmalarla sık sık gömülü çalışmayı programlayan insanlar, bu şekilde görünüyor, bu şekilde onlar için daha basit ve basit – Slava