2011-04-14 22 views
1

我最近有一個測試問題:如何在C#中的兩個字節的邏輯&工作?

byte a,b,c; 
a = 190; 
b = 4; 
c = (byte)(a & b); 

什麼是c的值?

我從來沒有以這種方式使用邏輯操作數,這裏發生了什麼?通過這個步驟,答案是4,但爲什麼?

此外,這將在現實世界中出現?我會爭辯說,以這種方式使用邏輯操作數和一個演員陣容,只是不好的做法,但我可能是錯的。

回答

2

邏輯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」。這是有道理的,因爲它對每個位執行邏輯與運算。所以你問題的標題其實是正確的。

+0

謝謝這個測試實際上使用了「邏輯AND」這個詞,這個詞讓我很失望。 – 2011-04-14 14:29:33

+0

這很有趣,我一直都在學習&按位和&&邏輯從我的C++天... – 2011-04-14 14:33:08

+0

@James Michael Hare - C#使用與C++不同的運算符。由於C#具有與數字類型不同的布爾類型,因此根據操作數的類型選擇操作。在C#中,&和&&的區別在於&&是操作的短路版本,而&需要評估兩個操作數。 – 2011-04-14 14:36:48

4

在這種情況下,您正在執行按位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

+0

只是一個類型,不是第4位,而是第3位。 – digEmAll 2011-04-14 14:21:05

+0

對不起,我應該更清楚,4位,而不是第4位是我的意思。 – 2011-04-14 14:31:39

1

這是按位AND,這意味着在兩個字節的位進行比較,並返回1,如果兩個位都爲1。

10111110 & 
00000100 
-------- 
00000100 
0

一個的邏輯&用途的字節在網絡中,稱爲Binary And Test。基本上,你通過將它們轉換成二進制邏輯和字節來實現邏輯和字節。

0

在二進制

4 == 100 190 == 10111110

&是和與運算的布爾運算符,它確實是這樣去二元和4以及以字節格式190,所以10111110 AND 100給你100,所以結果是4.

0

這是一個按位AND,而不是邏輯AND。邏輯AND是對條件的測試,即:

if(a && b) doSomething(); 

按位AND查看兩個變量的二進制值並將它們組合。例如:

10101010 & 
00001000 
--------- 
00001000 
0

這行了兩個數字的二進制,如下所示:

10111110 
00000100 
-------- 
00000100 

在每一列,它會檢查,看是否這兩個數字是1,如果是,它會返回1在底部。否則,它將在底部返回0。

0

我會爭辯說,以這種方式使用邏輯操作數,與一個強制轉換,只是不好的做法,但我可能是錯的。

沒有演員。 &在整數上定義,並且打算以這種方式使用。大家都知道,根據MSDN,這在技術上是合乎邏輯的運算符,我覺得這很瘋狂。