2010-04-09 41 views
18

我有一位byte(總是在最低位置),我想反轉1位。 即給00000001我想獲得00000000和00000000與我想00000001在C#中反轉1位#

我解決了它這樣的:

bit > 0 ? 0 : 1; 

我很好奇,看看還有別的工作要做。

回答

39

如何:

bit ^= 1; 

這只是XOR的第一位爲1,其切換它。

如果你想翻轉位#N,從0右側朝7左側計數(以字節爲單位),你可以使用這個表達式:

bit ^= (1 << N); 

這不會干擾任何其他位,但如果該值永遠只能將是0或1十進制值(即所有其它位爲0。),則以下可以用作良好:

bit = 1 - bit; 

同樣,如果只有要設置一位,可以使用與第一個位相同的值來反轉位#N:

bit = (1 << N) - bit; 

當然,在這一點上,你實際上並沒有在同一意義上進行位操作。

你擁有的表達也很好,但是也會操縱整個值。

另外,如果你曾表示單個位爲bool值,你可以這樣做:

bit = !bit; 

來回切換值。


更多笑話的: 當然,「enterprisey」的方式是使用一個查找表:

byte[] bitTranslations = new byte[256]; 
bitTranslations[0] = 1; 
bitTranslations[1] = 0; 

bit = bitTranslations[bit]; 
+0

這具有不需要第一位的優勢首先選擇,也是如此。 – 2010-04-09 08:17:09

+0

我第一次想用!但後來發現它只適用於布爾。有趣的東西,在這個級別工作。 – 2010-04-09 08:18:38

+0

我想說'表達它作爲一個布爾'的論點 - 取決於你在做什麼,可能會使代碼更容易閱讀下一個要維護的人。 – Paddy 2010-04-09 08:19:12

4

您的解決方案是不正確的,因爲如果位== 2 (10),那麼你的任務將產生位== 0(00)。

這是你想要什麼:

bit ^= 1; 
+0

你是對的,但我已經把位移到了最低位,所以這對我來說不是問題 – 2010-04-09 08:20:21

+0

如果你所要做的只是測試/操縱那一點,你可以擺脫這種轉變操作,只是用一個不同的常量對其進行異或(例如,如果它是第7個最重要的位,則執行類似bit^= 0x40的操作;) – par 2010-04-09 08:24:34