2013-11-01 176 views
0

我不完全理解按位操作和邏輯操作之間的區別。請參見下面的位運算:布爾邏輯混淆

X = 7和15

據我所知,x將在這種情況下,單獨地檢查每個位之後等於7。

布爾邏輯如何工作在較低的水平。我相信布爾是一個32位數據類型(我可能是錯的)。布爾文字(TRUE和FALSE)是否被視爲單個位?

+1

如何在內存中表示'boolean'是一個'implementation detail'。這意味着a)它不適合程序員關心,b)如果MS認爲它有意義,它可能會改變。 – igrimpe

+0

@igrimpe,我想了解在布爾邏輯的情況下,整個WORD是否被視爲一個單獨的位。 – w0051977

+0

如果在VB.Net中將任何數字轉換爲布爾值,則規則爲:如果爲0,則結果爲false。否則它是真的。如果將布爾轉換爲int(例如),事情會變得更加複雜。假將給0,但根據使用的轉換方法,真可能是1或-1。 VB.Net imho:布爾運算符和按位運算符混淆的最大來源似乎是「相同的」(其他語言有不同的運算符,但VB有相當的「歷史」)。 – igrimpe

回答

0

這通常是這些東西的工作原理。

按位操作對錶示其操作數的位執行布爾操作。邏輯運算是在布爾集上執行的布爾運算,通常爲TRUE和FALSE或1和0.布爾集可以是其中組成員的總計數爲2的任意組。在操作數7和15上:如果你使用的系統將它們表示爲沒有奇怪偏移的直接二進制數,那麼7變爲二進制0111,15變成二進制1111。二進制7的前導0不是必需的,因爲它與將任意十進制數前置0相同:10 = 010 = 000000000000010,但用前導零表示操作更容易。

0111 7 in binary 
1111 15 in binary 
&&&& bitwise AND 
0111 results in 7 

如果truefalse被表示爲二進制的1和0,則存在之間的「邏輯」 and和「逐位」 and操作沒有差異。在某些其它數目

1 true as binary 1 
0 false as binary 0 
& either logical or bitwise AND 
0 results in binary 0 

嘗試按位and像說1和2

01 1 in binary 
10 2 in binary 
&& bitwise and 
00 results in binary 0 

假設任何數量的除了0將被轉換爲true,在數字1和2執行「邏輯」 and會產生不同的結果

1 the number 1 converted to true and represented as boolean 1 
1 the number 2 converted to true and represented as boolean 1 
& logical and 
1 results in true, here represented as binary 1 

當執行位運算涉及浮點數,負數或基本除了積極的整數以外,任何其他的東西都可以結束,你可能會得到截然不同的結果。這是由於不同的環境使用不同的方法在內存中存儲數字。當然,它都是二進制的,但是,數字行並不總是以二進制零爲中心,並不總是每一位代表數字的一部分;一些位可能代表數字或指數的符號。如果您想將十進制數字轉換爲按位運算,則必須深入實現細節。如果您有一種將數字轉換爲二進制數據的方法,則更容易處理,因爲那樣您就可以準確地知道數字和它們的順序,並且可以測試您的期望是否符合您的結果。

1

不要對布爾的內部結構做任何假設。在許多語言(即C,C++)中,bool在內部表示爲int,除了值0之外的所有內容都被解釋爲true。但這是依賴於插入的,可能會在編譯器或編譯器版本之間發生變化。在像java或c#這樣的現代語言中,(上述語句的等價物)甚至不會編譯,因爲int不能隱式地轉換爲bool。

如果你確實需要按位運算,那麼語句當然是有效的,x的值將是7(因爲這是7和15的位數),但要將其轉換爲布爾值,明智的做法是明確地做,即if (x != 0) then...bool xb = x != 0。這可能有助於避免您的代碼讀者感到困惑,同時也清楚地表明您知道您現在正在進行類型轉換。