2013-03-28 115 views
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語句。

非常感謝您的任何建議,

+2

這些定義的值是什麼? – cnicutar 2013-03-28 09:40:09

+1

無論您的程序出現什麼問題,都不在您發佈的代碼中。 – 2013-03-28 09:40:41

+2

假設這些是不重複的不同位集,這個代碼是正確的。這些口罩的價值是什麼? – WhozCraig 2013-03-28 09:41:17

回答

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)) 總是如此。那是我的分析

+0

我的錯誤看到我的問題提交上面。 – ant2009 2013-03-28 10:04:30

+0

@ ant2009,好的,你可以在設置這些標誌之前將channel-> base.message設置爲零?也許在設置這些標誌之前,它已經有了這些標誌。 – MYMNeo 2013-03-28 10:06:53

0

其所需的二進制和操作&。 & &是邏輯和操作符。

if((channel->base.message & SIP_CONNECTED) & (channel->base.message & CALL_ACCEPTED)) { 
+0

爲什麼不邏輯和工作?在這種情況下,一個明智的操作會完全相反。 – Amit 2013-03-28 09:58:48

1

的代碼是正確的

如果兩個CALL_ACCEPTED設置和SIP_CONNECTED設置

可能是你做了檢查您的代碼中有一個錯誤之前的代碼到if只執行和CALL_ACCEPTEDSIP_CONNECTED設置不正確

檢查只是if兩個CALL_ACCEPTED和前設置正確。

您可以調試或檢查printf

+0

我的錯誤看到我的問題提交上面 – ant2009 2013-03-28 10:05:06

+0

問題沒有改變? – MOHAMED 2013-03-28 10:12:36