我不完全理解按位操作和邏輯操作之間的區別。請參見下面的位運算:布爾邏輯混淆
X = 7和15
據我所知,x將在這種情況下,單獨地檢查每個位之後等於7。
布爾邏輯如何工作在較低的水平。我相信布爾是一個32位數據類型(我可能是錯的)。布爾文字(TRUE和FALSE)是否被視爲單個位?
我不完全理解按位操作和邏輯操作之間的區別。請參見下面的位運算:布爾邏輯混淆
X = 7和15
據我所知,x將在這種情況下,單獨地檢查每個位之後等於7。
布爾邏輯如何工作在較低的水平。我相信布爾是一個32位數據類型(我可能是錯的)。布爾文字(TRUE和FALSE)是否被視爲單個位?
這通常是這些東西的工作原理。
按位操作對錶示其操作數的位執行布爾操作。邏輯運算是在布爾集上執行的布爾運算,通常爲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
如果true
和false
被表示爲二進制的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
當執行位運算涉及浮點數,負數或基本除了積極的整數以外,任何其他的東西都可以結束,你可能會得到截然不同的結果。這是由於不同的環境使用不同的方法在內存中存儲數字。當然,它都是二進制的,但是,數字行並不總是以二進制零爲中心,並不總是每一位代表數字的一部分;一些位可能代表數字或指數的符號。如果您想將十進制數字轉換爲按位運算,則必須深入實現細節。如果您有一種將數字轉換爲二進制數據的方法,則更容易處理,因爲那樣您就可以準確地知道數字和它們的順序,並且可以測試您的期望是否符合您的結果。
不要對布爾的內部結構做任何假設。在許多語言(即C,C++)中,bool在內部表示爲int,除了值0之外的所有內容都被解釋爲true。但這是依賴於插入的,可能會在編譯器或編譯器版本之間發生變化。在像java或c#這樣的現代語言中,(上述語句的等價物)甚至不會編譯,因爲int不能隱式地轉換爲bool。
如果你確實需要按位運算,那麼語句當然是有效的,x的值將是7(因爲這是7和15的位數),但要將其轉換爲布爾值,明智的做法是明確地做,即if (x != 0) then...
或bool xb = x != 0
。這可能有助於避免您的代碼讀者感到困惑,同時也清楚地表明您知道您現在正在進行類型轉換。
如何在內存中表示'boolean'是一個'implementation detail'。這意味着a)它不適合程序員關心,b)如果MS認爲它有意義,它可能會改變。 – igrimpe
@igrimpe,我想了解在布爾邏輯的情況下,整個WORD是否被視爲一個單獨的位。 – w0051977
如果在VB.Net中將任何數字轉換爲布爾值,則規則爲:如果爲0,則結果爲false。否則它是真的。如果將布爾轉換爲int(例如),事情會變得更加複雜。假將給0,但根據使用的轉換方法,真可能是1或-1。 VB.Net imho:布爾運算符和按位運算符混淆的最大來源似乎是「相同的」(其他語言有不同的運算符,但VB有相當的「歷史」)。 – igrimpe