2011-11-02 78 views
21

可能重複:
What is the tilde (~) in a C# enumeration?代字符在表達式中的含義是什麼?

我發現下面的代碼有點this MSDN頁面上。

(((Width * Planes * BitCount + 31) & ~31)/8) * abs(Height) 

這實際上確實在C#visual studio 2010中進行了編譯。究竟是在號碼31前面的代字號「〜」是什麼?我從來沒有在表達式中看過這個語法。

+2

它的按位補充。請參閱下面的鏈接。 [如何進行按位補運算符工作] [1] [1]:http://stackoverflow.com/questions/791328/how-does-the-bitwise-complement-operator-work – Nerdtron

+0

對於未來的參考這裏是c#操作符的列表。 [C#運營商](http://msdn.microsoft.com/en-us/library/6a71f45d.aspx) –

回答

5

這是bitwise complement operator

基本上,它翻轉位:

0xffff0000 == ~0x0000ffff 

在代碼您已發佈,做& ~31確保最後5位是0(按位和11111的補體,其是00000的)。

36

~ - bitwise NOT operator,基本上以二進制格式位取反

31是11111,因此〜31 == 00000,基本爲0

+0

+1,因爲這是最容易理解和最清晰的答案。 –

+5

該示例不正確,因爲前導零也被反轉。即'〜31 =〜0x0000001F = 0xFFFFFFE0' – JimiLoe

+1

這個例子不正確 31的二進制補碼是00000000000000000000000000011111(十六進制是0000001F - 如果計算32位)並且「〜」運算符翻轉這些位,所以答案將是11111111111111111111111111100000如果我們將它轉​​換爲十進制,答案是-32 如果64,31的二進制補碼是0000000000000000000000000000000000000000000000000000000000011111和「〜」翻轉位,這又是等同於-32。 AFAIK沒有運行C#的6位個人電腦,爲什麼你錯了。 如果有6位PC,這是正確的。 –

1

這是按位補運算符 - 它只是使所有0位到1秒反之亦然......見MSDN reference

在特定情況下,它只是創建(31 = 0x1F):

~0x1F = 0xFFFFFFE0 

它是用來與bitwise and (&)從而bascially它取消了最後5位。

0

〜31 = 31,在這種特定的情況下,按位否定是用來保持爲零(Width * Planes * BitCount + 31)

7

第一(從LSB)的5位您談談您得心應手ISO/IEC 23270:2006 — Information technology — Programming languages — C#複製和轉§ 14.6。神聖的寫作4。在那裏,你會發現:


14.6.4按位補運算符

對於應用〜X,一元運算符重載解析(§14.2.3)形式的操作來選擇特定的運算實現。的操作數轉換爲參數類型所選擇的操作者的,結果的類型是運營商的返回類型。預定義的按位補碼運算符爲:

int operator ~(int x) ; 
uint operator ~(uint x) ; 
long operator ~(long x) ; 
ulong operator ~(ulong x) ; 

對於這些運算符中的每一個,運算結果都是x的按位補數。

每個枚舉類型E隱式提供下列按位求補運算符:

E operator ~(E x); 

評估~x,其中x是枚舉類型E的具有基礎類型U表達式的結果,是完全一樣評估unchecked((E)(~(U)x))。當操作數類型是枚舉類型E(§14.2.3)時,此運算符僅由一元運算符重載分辨率考慮。

擡升(§14.2.7)上面定義的未提升預定按位求補運算符的形式也預先確定。


在你的情況~31是一樣的~ 0x0000001F0x0000001F的按位成分是0xFFFFFFE0。爲什麼他們不會寫出他們想要的真正的面具超出了我的想象。

相關問題