2016-01-22 57 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会更漂亮。速度确实很重要,但这并不重要。它的工作就像我试图用我的方法,但与名称。 –