2009年10月28日 星期三

C# Bitwise -- How to get status of bit in a value

C# Bitwise
一般看到Bitwise的文章裡都會提到 “位元(Bit)操作運算方式”會有:
1. OR ( | )
2. AND ( & )
3. XOR ( ^ )
4. NOT ( ~ )

基本的原則在此就不多提了,有興趣的人可以直接上Google上查Bitwise operator
這篇的主題主要是要針對 “對某個位元進行操作”, 白話文的意思是就, 有時可能會遇到必須對1個byte裡頭的某個bit行操作. 用以判斷該bit的狀態為 0 或是 1.
由於過去大多數在寫應用程式時都用不太上這種位元操作,所以搞了好一段時間才明白,並做一個簡單的整理.

1 Byte = 8 Bits

所以在二進位裡看到的樣子會像是以下的結構
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0


但由於我們在程式中取得到的值大多都是10進制 or 16進制. 所以在這個主題中我們先假設有一個值為 0x32 (16進制) 00110010 (2進制)
放到上述的表格裡頭之後會是以下的格式:
128 64 32 16 8 4 2 1
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
0 0 1 1 0 0 1 0

所以, 如果要將某個Bit的狀態取出的方法就會是:

int x = 0x32 & 128 (檢查bit 7的狀態)
if( x ==0 )
// 如果x 值為0時表示該bit 狀態為 0
else
// 如果 x 值不為0時表示該bit 狀態為 1

當然,也可以簡化一下寫成下面這個樣子
int x = 0x32 & 128
int y = (x==0)? 0 : 1;
這樣就可以輕鬆的取到期望的bit狀態.
最後, 如果要取其他bit怎麼辦? 答案是… 一個一個作唄.
int x = 0x32 & 1 //取bit 0的狀態
int x = 0x32 & 2 //取bit 1的狀態
int x = 0x32 & 4 //取bit 2的狀態
int x = 0x32 & 8 //取bit 3的狀態
int x = 0x32 & 16 //取bit 4的狀態
int x = 0x32 & 32 //取bit 5的狀態
int x = 0x32 & 64 //取bit 6的狀態
int x = 0x32 & 128 //取bit 7的狀態

這樣就可以把從 bit 0 ~ bit 7的狀態一一的取出進行判斷了.

沒有留言:

張貼留言