2016-01-22 66 views
1

好了,讓我們用一個32位整數開始:位操作

int big = 536855551; // 00011111111111111100001111111111 

現在,我想這個整數中的最後10位爲:

int little = 69; // 0001101001 

所以,我的做法是這樣的:

big = (big & 4294966272) & (little) 

其中4294966272是第22位,或11111111111111111111110000000000

但當然這不支持,因爲4294966272不在int範圍0x7FFFFFFF之內。另外,這不會是我唯一的操作。我還需要能夠通過14中的位11我的方法爲(同樣的問題)是:

big = (big & 4294951935) | (little << 10) 

與解釋的方式進行

所以,這裏是我什麼作爲做替代對上面:

1: ((big >> 10) << 10) | (little) 
2: (big & 1023) | ((big >> 14) << 14) | (little << 10) 

我不覺得像我替代的是最好的,有效的方式,我可以走了。有沒有更好的方法來做到這一點?

旁註:如果C#支持二進制文字,'0b',這將會更漂亮。

謝謝。

+0

使用BigInteger .....? –

+0

@MitchWheat我從來沒有想過......你能給我示例一個例子(最好是作爲一個答案,所以如果它的工作,我可以接受它),這將反映我上面的例子? –

+0

https://msdn.microsoft.com/en-us/library/system.numerics.biginteger_operators(v=vs.110)。aspx –

回答

2

4294966272實際上應該是-1024,其表示爲11111111111111111111110000000000

例如:

int big = 536855551; 
int little = 69; 
var thing = Convert.ToInt32("11111111111111111111110000000000", 2); 
var res = (big & thing) & (little); 

雖然,結果將始終爲0

00011111111111111100001111111111 
& 
00000000000000000000000001101001 
& 
11111111111111111111110000000000 
+0

我喜歡這個,因爲我可以將遮罩定義爲常量,它看起來不錯。它的工作方式與我的方法完全相同,但名稱完全相同 –

2

位移通常更快進行比較的位移+掩模(即,&)。我有一個test case它。

你應該去你的第一個選擇。

1: ((big >> 10) << 10) | (little) 

無符號之間就謹防a little difference並簽署int當談到位移動。

或者,您可以將biglittle定義爲無符號。使用uint而不是int

+0

這是一個可以接受的答案,但是如果我將掩碼定義爲常量,Rob's會更漂亮。速度確實很重要,但這並不重要。它的工作就像我試圖用我的方法,但與名稱。 –