我最近有一個測試問題:如何在C#中的兩個字節的邏輯&工作?
byte a,b,c;
a = 190;
b = 4;
c = (byte)(a & b);
什麼是c的值?
我從來沒有以這種方式使用邏輯操作數,這裏發生了什麼?通過這個步驟,答案是4,但爲什麼?
此外,這將在現實世界中出現?我會爭辯說,以這種方式使用邏輯操作數和一個演員陣容,只是不好的做法,但我可能是錯的。
我最近有一個測試問題:如何在C#中的兩個字節的邏輯&工作?
byte a,b,c;
a = 190;
b = 4;
c = (byte)(a & b);
什麼是c的值?
我從來沒有以這種方式使用邏輯操作數,這裏發生了什麼?通過這個步驟,答案是4,但爲什麼?
此外,這將在現實世界中出現?我會爭辯說,以這種方式使用邏輯操作數和一個演員陣容,只是不好的做法,但我可能是錯的。
邏輯AND運算符應用於整數時,會執行按位AND運算。在兩個操作數中出現1的每個位置的結果都是1。
0011
& 0101
------
0001
十進制值190等價於二進制10111110.十進制4是二進制00000100
執行邏輯與操作在這樣的位:
10111110
& 00000100
----------
00000100
所以結果是4 。
此外,這會在現實世界中出現?我會爭辯說,以這種方式使用邏輯操作數和一個演員陣容,只是不好的做法,但我可能是錯的。
這些操作在多種情況下很有用。最常見的是當使用枚舉值作爲標誌。
[Flags]
public enum MyFileOptions
{
None = 0,
Read = 1, // 2^0
Write = 2, // 2^1
Append = 4, // 2^2
}
如果Enum的值是2的冪,那麼它們可以合併成一個整數變量(使用邏輯OR運算符)。
MyFileOptions openReadWrite = MyFileOptions.Read | MyFileOptions.Write;
在這個變量中,兩個位都被設置,所以它表示選擇了讀和寫選項。
邏輯AND運算符可用於測試值。
bool openForWriting = ((openReadWrite & MyFileOptions.Write) == MyFileOptions.Write);
注意
很多人都指出,這實際上是一個位,而不是一個邏輯與。在我發佈之前,我在規範中對它進行了查看,我很驚訝地發現在規範中兩個版本都被稱爲「邏輯AND」。這是有道理的,因爲它對每個位執行邏輯與運算。所以你問題的標題其實是正確的。
在這種情況下,您正在執行按位AND操作,而不是邏輯AND,它將& b的兩個值的位組合在一起,並給出僅設置了兩個位的結果,這兩個值都設置在& b,在這種情況下,只有4位的位。
190 = 10111110
& 4 = 00000100
-------------------
= 4 00000100
編輯:有趣的是,MSDN本身就是是否把它稱爲邏輯VS按位有點泥濘的問題。在他們對邏輯運算符(& | || etc)的描述中,他們說邏輯運算符(bitwise和bool),但是在&本身的描述中,它表示它對整數執行按位AND和對bools執行邏輯AND。看起來它仍然被認爲是一個邏輯運算符,但整數類型之間的操作是按位與。
http://msdn.microsoft.com/en-us/library/sbf85k1c(v=vs.71).aspx
只是一個類型,不是第4位,而是第3位。 – digEmAll 2011-04-14 14:21:05
對不起,我應該更清楚,4位,而不是第4位是我的意思。 – 2011-04-14 14:31:39
這是按位AND
,這意味着在兩個字節的位進行比較,並返回1,如果兩個位都爲1。
10111110 &
00000100
--------
00000100
一個的邏輯&用途的字節在網絡中,稱爲Binary And Test。基本上,你通過將它們轉換成二進制邏輯和字節來實現邏輯和字節。
在二進制
4 == 100 190 == 10111110
&是和與運算的布爾運算符,它確實是這樣去二元和4以及以字節格式190,所以10111110 AND 100給你100,所以結果是4.
這是一個按位AND,而不是邏輯AND。邏輯AND是對條件的測試,即:
if(a && b) doSomething();
按位AND查看兩個變量的二進制值並將它們組合。例如:
10101010 &
00001000
---------
00001000
這行了兩個數字的二進制,如下所示:
10111110
00000100
--------
00000100
在每一列,它會檢查,看是否這兩個數字是1,如果是,它會返回1在底部。否則,它將在底部返回0。
我會爭辯說,以這種方式使用邏輯操作數,與一個強制轉換,只是不好的做法,但我可能是錯的。
沒有演員。 &
在整數上定義,並且打算以這種方式使用。大家都知道,根據MSDN,這在技術上是合乎邏輯的運算符,我覺得這很瘋狂。
謝謝這個測試實際上使用了「邏輯AND」這個詞,這個詞讓我很失望。 – 2011-04-14 14:29:33
這很有趣,我一直都在學習&按位和&&邏輯從我的C++天... – 2011-04-14 14:33:08
@James Michael Hare - C#使用與C++不同的運算符。由於C#具有與數字類型不同的布爾類型,因此根據操作數的類型選擇操作。在C#中,&和&&的區別在於&&是操作的短路版本,而&需要評估兩個操作數。 – 2011-04-14 14:36:48