2014-02-24 53 views
1

我需要明確一些字節數組的字節位。如何清除一個字節的位?

的作品不錯,但明確沒有編譯(我猜是因爲否定爲int的結果,它由當時和......是負)。

public const byte BIT_1 = 0x01; 
public const byte BIT_2 = 0x02; 

byte[] bytes = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; 

// set 1st bit 
for (int i = 0; i < bytes.Length; i++) 
    bytes[i] |= BIT_1; 

// clear 2nd bit (set it to 0) 
for (int i = 0; i < bytes.Length; i++) 
    bytes[i] &= (~BIT_2); 

我怎樣才能明確位字節的最好簡單的方法?

+0

你是什麼意思***「刪除」***?將它設置爲0? – RononDex

+0

C.BIT_1是什麼?我看到你已經定義了一個常量字節BIT_1,但是我無法得到C.BIT_1。 – Christos

+0

@ChristosPaisios它是一個變量..聲明在代碼的頂部... –

回答

8

試試這個:在字節(上字節和只有在這種情況下

int i = 0; 

// Set 5th bit 
i |= 1 << 5; 

Console.WriteLine(i); // 32 

// Clear 5th bit 
i &= ~(1 << 5); 

Console.WriteLine(i); // 0 

版本:

byte b = 0; 

// Set 5th bit 
b |= 1 << 5; 

Console.WriteLine(b); 

// Clear 5th bit 
b &= byte.MaxValue^(1 << 5); 

Console.WriteLine(b); 
+0

爲什麼不使用按位不? '〜'? XOR有什麼用? –

+1

@MatthewWatson常數值'-33'不能轉換爲'byte''。 XOR是保持積極世界的一種簡單方法,因此可以避免不必要的施法:) – Spook

+1

@Spook但是,這隻適用於因爲您已對硬盤中的'5'進行了硬編碼。嘗試用變量替換它,並且不再編譯。 –

2

看來,你不能沒有字節轉換爲做到這一點一個int首先。

byte ClearBit(byte b, int i) 
{ 
    int x = Convert.ToInt32(b); 
    x &= ~(1 << i); 
    return Convert.ToByte(x); 
} 
1

這可以通過轉換爲int,然後再返回來避免:

bytes[i] = (byte)(bytes[i] & ~(BIT_2)); 
0

按位操作沒有被字節上所定義,以及使用它們與字節will always return an int。所以當你在你的字節上使用按位NOT時,它會返回一個int,並且當你嘗試與另一個字節進行AND時,會產生一個錯誤。

要解決這個問題,需要再次將結果明確地轉換爲一個字節。

byte bit = 0x02; 
byte x = 0x0; 

// set 
x |= bit; 
Console.WriteLine(x); // 2 

// clear 
x &= (byte)~bit; 
Console.WriteLine(x); // 0 
+0

這在技術上是可行的,但代碼(OP和你的)都不清楚,因爲它表明,如果你將bit設置爲0x03,它將清除第3位,但它不會(至少不是OP會希望它如何)。根據我的理解,核心問題是編寫清除第n位的代碼,而不僅僅是一個特定的代碼。 – Spook

+0

@Spook不,OP的代碼不會以任何方式暗示他們將如何接近第三位。他們可以很容易地將'BIT_3'設置爲'0x04',一切都會好起來的。 – poke