2013-10-31 57 views
15

我有這個整數int nine = 9;它在二進制中是1001。有沒有簡單的方法反轉它,所以我可以得到0110一種反轉整數變量二進制值的方法

+4

C#中的** int ** 9不是'1001'。提示:它超過4位。 – mbeckish

+4

只是爲了給mbeckish的提示'int 9'的答案是'0000 0000 0000 1001',所以如果你「反轉9」,會給你'1111 1111 1111 0110' –

+2

@neoistheone今天萬聖節的精神不是嗎? – Servy

回答

-1

與使用111111 XOR ....

var inverted = a^int.MinValue 
+0

這對於負數不起作用,假設您的意思是int.MaxValue。 –

+0

答:據我所知,'a^int.MaxValue'翻轉31位,其中有32位在int中。實際上,每一個整數都是錯誤的,不僅僅是負數,我只是因爲它是位32,它告訴你數字的符號,這是錯誤的事實而感到困惑。我認爲,正確的是'a^int.MinValue'。 –

+0

謝謝,你正確 – sh1ng

14

有運營商專門爲它,~

nine = ~nine; 
+1

取決於如果OP想要3或-10作爲結果。 – mbeckish

+0

@mbeckish,你具體是什麼意思? –

+0

@neoistheone - 請參閱Scott Chamberlain對這個問題的評論。 – mbeckish

28
int notnine = ~nine; 

如果你擔心只有最後一個字節:

int notnine = ~nine & 0x000000FF; 

如果你只是在最後四位感興趣:

int notnine = ~nine & 0x0000000F; 

~ operator是按位否定,而掩碼只給出你所關心的字節/半字節。

如果你真的有興趣的只有最後四位,該簡單的就是:

int notnine = 15 - nine; 

作品,每四位。 :-)

+0

看起來像OP想要最後一個半字節。 – mbeckish

+0

@mbeckish在您評論的同一時間,我已經編輯了該文章的代碼。 :-) –

+0

+1對你........ – mbeckish

2

如果我們考慮到9這樣一個整數:

00000000000000000000000000001001 

,你想有:

00000000000000000000000000000110 

代替:

11111111111111111111111111110110 

,做護理大約比上一個半字節要多(例如也想處理128903)。

然後你就可以創建模板,並將其應用:

uint value = 9; //or try 1290320 
uint mask = 0; 
for (int i = 1; i <= 16; i *= 2) 
    mask |= mask >> i; 
value = mask & (~value); 

你可以使用http://en.wikipedia.org/wiki/Find_first_set修改後的版本,或使用BSF ASM指令加速此。

2

這個問題沒有完全指定 - 你只關心4位,還是應該根據輸入的有效位數來調整?如果是後者,則需要一些複雜的位操作來屏蔽高位。

我稍微修改Bit Twiddling Hack來創建掩碼。

int mask = num; 
mask |= mask >> 1; 
mask |= mask >> 2; 
mask |= mask >> 4; 
mask |= mask >> 8; 
mask |= mask >> 16; 
int inverse = ~num & mask; 

看到它在行動:http://ideone.com/pEqwwM

0

1)要翻轉

mask = (1<<n) - 1 

2)最後n位創建一個口罩使用XOR

a^mask 

另外,如果你想從二進制表示的第一個開始翻轉位,你可以這樣做

n = 0; while ((1<<n) <= a) n++; 
相關問題