2009-04-27 46 views
8

我正在基於Velleman k8055開發板的一個小硬件接口項目上工作。爲什麼AND兩個數字要得到一個布爾值?

示例代碼來在VB.Net,我重寫這個到C#,主要是爲了有機會步執行代碼,使這一切的感覺。

有一件事我百思不得其解,但:

在一個階段,他們閱讀所有數字輸入,然後設置一個複選框基於答案讀取數字輸入(該回來的整數),然後他們和這有一個數字:

i = ReadAllDigital 
cbi(1).Checked = (i And 1) 
cbi(2).Checked = (i And 2) \ 2 
cbi(3).Checked = (i And 4) \ 4 
cbi(4).Checked = (i And 8) \ 8 
cbi(5).Checked = (i And 16) \ 16 

我還沒有在一段時間做數字系統,我知道他們正在嘗試做的,但它必須和兩個數字有什麼影響? 0以上的所有內容都不等於真實嗎?

你會如何翻譯這爲C#?

+0

感謝您的所有答案...我從來沒有機會在過去做任何Bitwise的東西...嗯,我想我不能再說了。 ;-) – Gineer 2009-05-01 09:51:00

回答

15

我想你會需要它翻譯成這樣:

i & 1 == 1 

i & 2 == 2 

i & 4 == 4 

等等 這是使用按位與運營商。

當您使用位AND運算符,這樣操作人員比較兩個給定的值的二進制表示,並返回只有那些位設置一個二進制值,這也是在兩個操作數設置。

例如,當你這樣做:

它會做到這一點:

0010 & 0010 

,這將導致:

0010 
0010 
&---- 
0010 

然後,如果你將這個結果與2(0010)進行比較,它就會返回true。

19

這是做bitwise AND,不是邏輯和。

每個那些的基本決定是否在i單個位被設置,例如:

5 AND 4 = 4 
5 AND 2 = 0 
5 AND 1 = 1 

(因爲5 =二進制101,和圖4,2和1是二進制100的十進制值,010和001分別。)在二進制例如

+0

5 AND 4 = 4,當然,這就是爲什麼問題說(5 AND 4)\ 4 – MSalters 2009-04-27 10:02:47

1

想到這

10101010 

AND 

00000010 

產生00000010

即不爲零。現在,如果第一個值是

10101000 

你會得到

00000000 

即爲零。

注意進一步分化的一切減少到1或0。

1

(i和16)/ 16提取第5位的值(1或0)。

1xxxx and 16 = 16/16 = 1 
0xxxx and 16 = 0/16 = 0 
1

And運算符執行「...兩個數字表達式的按位數連接」,映射到「|」在C#中。 「」是integer division,如果兩個操作數都是整數類型,則C#中的等效值爲/

1

常數是masks(以二進制形式考慮它們)。所以代碼的作用是在字節和掩碼上應用bitwise AND運算符併除以數字,以獲得該位。

例如:

xxxxxxxx & 00000100 = 00000x000 
if x == 1 
    00000x00/00000100 = 000000001 
else if x == 0 
    00000x00/00000100 = 000000000 
1

如所述,這是一個按位AND,而不是一個邏輯AND。我確實看到這在我之前已經說過很多次了,但海事組織的解釋並不那麼容易理解。

我喜歡把它像這樣:

寫了二進制數下對方(我在這裏做5和1):

101 
001 

現在我們需要把它變成二進制數,所有從第1號1成的,這也是第二個被轉移,那就是 - 在這種情況下:

001 

在這種情況下,我們看到它給出了相同數量作爲第二數字,我這個操作(在VB中)返回true。讓我們來看看另一個例子(使用5,因爲我):

(5和2)

101 
010 
---- 
000 

(假)

(5和4)

101 
100 
--- 
100 

(真)

(5和8)

0101 
1000 
---- 
0000 

(假)

(5和16)

00101 
10000 
----- 
00000 

(假)

編輯:顯然我錯過了問題的整個點 - 這裏的翻譯,以C#:

cbi[1].Checked = i & 1 == 1; 
cbi[2].Checked = i & 2 == 2; 
cbi[3].Checked = i & 4 == 4; 
cbi[4].Checked = i & 8 == 8; 
cbi[5].Checked = i & 16 == 16; 
3

只需添加: 它被稱爲位掩碼 http://en.wikipedia.org/wiki/Mask_(computing)

一個布爾值只需要1位。在大多數編程語言的實現中,布爾值需要多於一個位。在個人電腦上這不會是一個大的浪費,但是嵌入式系統通常存儲空間非常有限,所以浪費非常重要。 爲了節省空間,布爾值被打包在一起,這樣布爾變量只佔用1位。

你可以把它看作是做這樣的事情的數組索引操作,隨着越來越像8個布爾變量數組的字節(= 8位),所以也許這就是你的答案:使用布爾值數組。

1

在C#中使用BitArray class來直接索引各個位。

若要設置單個位很簡單:

b |= 1 << i; 

要復位單個位是多了幾分尷尬:

b &= ~(1 << i); 

要知道,無論是位運算符換班經營者傾向於將所有事情推廣到int,這可能意外需要施放。

1

我比較喜歡在旋轉位時使用十六進制符號(例如0x10而不是16)。它更有意義,因爲您增加您的位深度爲0x20000比131072更好。

相關問題