2011-06-28 49 views
12

[如何使用〜運營商]如何在C中使用逆

我有一個結構說Alpha。我知道Alpha(如a)中的元素的值,它可以是01 - 我想讓同一結構的其他元素取反Alpha.a的值。例如:

if Alpha.a = 1 
then Alpha.b = 0 

,反之亦然

我曾嘗試:

Alpha.b = ~ (Alpha.a) 

但遺憾的是它不工作 - 當Alpha.a1Alpha.b被設置爲254

任何想法?

感謝和問候,

SamPrat

+6

**它爲什麼不起作用?會發生什麼?** – SLaks

+0

它顯示價值254 – samprat

+2

嗨,大家好,我渴望知道爲什麼我的問題被拒絕投票,以便下一次我會解決我的錯誤? – samprat

回答

22

使用XOR運算符:

Alpha.b = Alpha.a^1; 
+0

這個作品完美無缺 – samprat

+0

非常感謝您的快速幫助 – samprat

0

你想使用另算。具體!

Alpha.b = !Alpha.a 

由於值爲零或一,所以它非常簡單。

+0

也嘗試過。它不工作 – samprat

+8

**爲什麼不呢?會發生什麼?** – SLaks

3

~運算符否定每個單獨的位。例如,假設Alpha.aunsigned char。然後~1會以二進制形式讀取〜00000001,結果將是11111110(再次,二進制),它與十進制中的254和十六進制中的0xFE相同。

正如其他人所建議的,使用!Alpha.aAlpha.a^1

29

在C中,true由1表示,而false由0表示。但是,在比較中,任何非假值都被處理爲真。

!操作者確實布爾反轉,所以!0爲1且!1是0。

~操作者,然而,確實按位反轉,其中在值的每一位被替換爲它逆。所以〜0是0xffffffff(-1)。 〜1是0xfffffffe(-2)。 (-1和-2都被認爲是真實的,這可能會讓你感到困惑。)

你想要的是!,而不是~

0

您不能使用~,因爲這會將00000000轉換爲11111111而不是00000001,因爲我認爲您期待。

如果你有布爾變量可以使用:

Alpha.b = !(Alpha.a) 

,但如果沒有,你可能需要使用的if/else邏輯:

if (Alpha.a == 0) 
{ 
    Alpha.b = 1; 
} 
else 
{ 
    Alpha.b = 0; 
} 
+0

我可能試圖構建消息,所以如果在我的代碼的這個階段不推薦其他東西 – samprat

1

一個很好的跨平臺跨語言的解決這一常見問題是:

Alpha.b = 1 - Alpha.a; 
0

怎麼樣的後操作位掩碼?

使用無符號的字符找位0:

b = 0x01u & (~a); 

甚至

b = a^0x01u; 

或者 「布爾思想家」(注意TRUE和FALSE可以從0/1不同,如果你想!它「真正的布爾」你應該如果定義了使用TRUE和FALSE)

b = (1 != a)?(0u):(1u); 

乾杯