0
gcc 4.7.2
c89

こんにちは、

enum message_e {
    SIP_CONNECTED = 1 << 0,
    CALL_ACCEPTED = 1 << 1
};

コードのさまざまな部分でビットを設定します。

channel->base.message |= CALL_ACCEPTED;
channel->base.message |= SIP_CONNECTED;

後で、両方のビットが設定されていることを確認したいと思います。

if((channel->base.message & SIP_CONNECTED) && (channel->base.message & CALL_ACCEPTED)) {
    /* IF BOTH BITS ARE SET CALL_ACCEPTED and SIP_CONNECTED */    
}

これらのビットのみが設定されている場合にのみ、if ステートメントを通過したいと考えています。CALL_ACCEPTED が設定され、SIP_CONNECTED が設定されていない場合、およびその逆の場合。

ただし、どちらか一方だけを設定すると if 文に陥ってしまうようです。

ご提案いただきありがとうございます。

4

3 に答える 3

1

コードは正しいです

へのコードは、両方が設定され、設定されifている場合にのみ実行さ れますCALL_ACCEPTEDSIP_CONNECTED

チェックを行う前に、コードにエラーがあり、 CALL_ACCEPTEDorSIP_CONNECTEDが正しく設定されていない可能性があります

ifその両方 が正しく設定されてCALL_ACCEPTEDいることを直前に確認してください。SIP_CONNECTED

デバッグまたはで確認できますprintf

于 2013-03-28T09:43:24.283 に答える
1

CALL_ACCEPTED と SIP_CONNECTED マクロを確認しましたか?それらは互いに競合していませんか?例:

CALL_ACCEPTED is 0x01 and SIP_CONNECTED is 0x11.

コードの後:

channel->base.message |= CALL_ACCEPTED;
channel->base.message |= SIP_CONNECTED;

channel->base.message = 0x11;

if((channel->base.message & SIP_CONNECTED) && (channel->base.message & CALL_ACCEPTED)) それは常に真実です。それが私の分析です

于 2013-03-28T09:52:38.173 に答える
0

必要なのは二項 AND演算子 &です。&& は論理 AND 演算子です。

if((channel->base.message & SIP_CONNECTED) & (channel->base.message & CALL_ACCEPTED)) {
于 2013-03-28T09:43:11.890 に答える