2016-03-22 12 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_invertedfalse^vw_ptt_invertedを使用していますなぜ私はちょうど得ることはありません。このビット単位の演算(整数)の出力は、関数の入力の型(ブール値)と一致しません。また、0^Aのポイントは何ですか? 0^A==Aはありませんか?ポートとvw_tx_stop()出力0に

+0

これは単なるランダムなコードです。それを理解しようとしないでください、それは意味をなさない。 – SergeyA

答えて

3

通常vw_tx_start()出力1:

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

あなたは1にflag vw_ptt_invertedを設定した場合、vw_tx_start()意志出力0とvw_tx_stop() 1:

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

vw_set_ptt_inverted()はブール値を受け入れる必要がありますがタイプを入力するか、入力をチェックしてください。フラグを任意の数に設定すると、正しく動作しません。

型の場合、ブール値は暗黙的にint(true => 1、false => 0)に変換され、その逆(0以外=> true、0 => false) xor演算を実行し、結果の整数をルールに従ってブール値に変換し直します。

+0

ありがとう!今、コードの動作を理解していますが、まだ質問があります。 ビットワイズXORを使用していないのですか? 'false^vw_ptt_inverted'の代わりに' true^vw_ptt_inverted'と 'vw_ptt_inverted'の代わりに'!vw_ptt_inverted'を使うことはできませんか? –

+0

あなたは正しいです、 'false^vw_ptt_inverted'は意味をなさない。 –

+0

@GabrielAguiarはい、できれば、バイナリ操作での埋め込み作業のプログラミングを頻繁に行う人は、このように見えるので、よりシンプルで簡単です – Slava

関連する問題