2013-07-14 35 views
0

我是這樣做的:How do you set, clear and toggle a single bit in C?如何在C#中清除一個位?

一位清

使用位AND運算符(&)來清除位。

number & =〜(1 < < x);

這將清除位x。您必須用 位運算符NOT(~)反轉位串,然後進行與運算。

它適用於有符號整數類型,但不適用於無符號整數(例如UInt32)。編譯器說,對無符號類型做這種操作是不可能的。如何處理無符號數字以清除一位呢?

回答

2

實際上並沒有這麼說。它說:「不能隱式地將類型'int'轉換爲'uint'。存在明確的轉換(您是否缺少演員?)」

這是因爲1 << x將是int類型。

嘗試1u << x

0

你可以投的結果,這是一個long,回uint,如果你有一個正常的&更換複合運算&=

uint number = /*...*/; 
number = (uint)(number & ~(1 << x)); 

另一種方法是使用unchecked塊:

uint number = /*...*/; 
unchecked 
{ 
    number &= (uint)~(1 << x); 
} 
+0

沒有(中間)結果是'長'。 –

+0

@HenkHolterman:'(number&〜(1 << x))。GetType()'是'System.Int64' – pascalhein

+0

令我驚訝的是,是的。但是'(number&〜(1U << x))。GetType()'是'System.Int32' –

1
UInt32 number = 40; 
Int32 x = 5; 
number &= ~((UInt32)1 << x); 
+0

是的,移位器必須被簽名,移位器可以是無符號的。 '(UInt32)1'可以寫成'1U' –