2009-10-08 61 views
9

我在C#中使用了單符號(&),意思是「檢查第二個條件語句,即使第一個是」。C#中單個&符號的第二個含義是什麼?

但以下似乎是一個不同含義的&,任何人都可以解釋如何i & 1作品在下面的例子嗎?

List<int> scores = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 }; 
var evenScores = scores.Where(i => i % 2 == 0); 
var evenScores2 = scores.Where(i => (i & 1) == 0); 
+0

如果您考慮這個說法......效率低下。 – Min 2009-10-08 13:42:25

+0

我從這個問題得到它http://stackoverflow.com/questions/1537528/how-to-convert-system-linq-enumerable-wherelistiteratorint-to-listint/1537568#1537568其中它表明&變種是更快。 – 2009-10-08 13:57:25

回答

31

單個&是 「按位與運算符」,就像dove說過。我在看第二部分的問題:「爲什麼它有效?」

想想二進制:

000 = 0 
001 = 1 
010 = 2 
011 = 3 
100 = 4 
101 = 5 
110 = 6 
111 = 7 
and so on 

注意所有偶數0結束;所以如果最後一位按位檢查1返回零(意思是「不匹配」),則它是一個偶數;

+0

在C++中,您可以使用&bool值*,因爲* bool會自動轉換爲零或一個(並返回) - 一旦優化了演員陣容,您將剩下一些等同於&&的東西,但不會進行短路評估(所以你保證正確的子表達式的副作用發生)。我認爲這適用於C#和Java,但不確定ATM。 – Steve314 2009-10-08 14:04:02

+0

@Steve:根據OP的問題,他們已經知道這種行爲是作爲一種不短路布爾邏輯的方式存在的。 – 2009-10-08 15:30:47

+0

@Jeff - 但他不知道運營商是什麼,所以不知道爲什麼它的工作。只是試圖將現有的知識與新的知識聯繫起來,澄清愛德華知道的布爾行爲不符合你所解釋的按位行爲和整型鑄造行爲。 – Steve314 2009-10-09 07:09:16

3

按位AND運算符。

16

Here:它的操作數的

一元& operator返回地址(需要unsafe上下文)。

二進制& operators是爲整數類型和布爾值預定義的。對於整數類型,&計算其操作數的邏輯按位AND。對於bool操作數,&計算其操作數的邏輯AND;也就是說,當且僅當它的兩個操作數都爲真時,結果才爲真。

& operator對兩個運算符都進行評估,而不管第一個運算符的值如何。

6

對於布爾類型,你提到的是它的行爲。

對於整數類型,它是按位「和」運算符。

它可以重載其他類型。

基本上,表達式(i & 1) == 0檢查是否設置了最低有效位i,只有當該數字是奇數時纔會發生。

4

&符號表示按位與運算。按位運算符返回兩個操作數中每個對應位之間的比較結果。

例如,如果x是0110且y爲1010,則在與x和y(x & y)的結果的按位0010

7

以前的答案是真實的,但沒有解決如何&不同於& &,我認爲這是你的原始問題,所以我會採取的。

如前所述,「&」是一個按位與。 「& &」是邏輯AND。&對其操作數進行與運算的一點一點的操作,並且通常功能與加號或次數或任何算術運算符完全相同。 & &比較複雜。如果將每個操作數與零進行比較。如果第一個操作數爲零,則它假定值爲FALSE,並將表達式的其餘部分短路,即它不評估任何剩餘的操作數。如果第一個值不爲零,則檢查第二個值。如果這個值爲零,則假定值爲假,否則假定值爲真。在任何情況下,它都會繼續評估表達。

即,有和&之間的兩個關鍵差異& &:

  1. &操作,而& &僅考慮零和非零的,並總是返回逐位爲0或1。因此5 & 6(二進制101 & 110)給出4(二進制100),而5 & & 6給出1(真)。

  2. & &「短路」。如果第一個值爲零,則不會評估第二個值。 &沒有這樣的規則。這在幾個方面很重要。首先,如果第二個值有任何副作用,那麼總是會發生這些副作用,而他們不會。&他們不會。因此,「x &(y ++)」將始終增加y,而「x & &(y ++)」只會在y不爲零時增加y。如果第二個操作數是一個函數調用,這變得更加重要 - 並且可能更加微妙。其次,第一個值可能會測試確定第二個值無效的內容。像「x!= NULL & & x-> foo == 3」。與&,當x是空的,可能炸彈與段錯誤或等效。第三,可能會有重要的性能收益。生活「,x!='A'& & readTonsOfStuffFromDatabaseAndCalculateTotal(x)」。與&,閱讀會發生無論如何,也許是浪費時間。

這就是爲什麼我們幾乎總是使用& &的事情,真的是邏輯運算,並限制使用的&當我們真正想要逐位操作。但有時候你不希望發生短路,在這種情況下,&可能是一個不錯的選擇。但是,如果您正在使用它來「邏輯地」操作,請注意操作數可以具有除0或1之外的任何值。1 & & 2爲true,但是1 & 2爲false。

+0

感謝*實際*解釋它 – BritishDeveloper 2012-10-24 14:13:43

+1

請注意,在C#中,'&&'操作符只能在兩個'bool'之間使用,因此詢問第一個操作數是否爲零無效(在C#中,「bool」只能是'false'或'true',絕不是數字),特別是'5 && 6'是不允許的。但是描述與其他語言相關。 – 2012-11-29 20:22:03

+0

哎呀,我從C#移植到C/C++。 – Jay 2012-12-11 18:25:54

相關問題