1

好的,让我们从一个 32 位整数开始:

int big = 536855551; // 00011111111111111100001111111111

现在,我想将最后 10 位设置为这个整数:

int little = 69; // 0001101001

所以,我的方法是这样的:

big = (big & 4294966272) & (little)

哪里4294966272是前 22 位,或11111111111111111111110000000000.

但是当然这不被支持,因为4294966272它超出int0x7FFFFFFF. 此外,这不会是我唯一的操作。我还需要能够设置位 11 到 14。我的方法(有同样的问题)是:

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

因此,有了解释,这就是我正在做的替代上述内容的方法:

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

我不觉得我的替代方案是我能走的最好、最有效的方式。有没有更好的方法来做到这一点?

旁注:如果 C# 支持二进制文字'0b',这将更漂亮。

谢谢。

4

2 回答 2

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
于 2016-01-22T03:54:58.603 回答
2

与位移+掩码(即&)相比,位移通常更快。我有一个测试用例

你应该选择你的第一个选择。

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

在位移方面,请注意无符号和有符号之间的一点区别。int

或者,您可以将bigand定义little为无符号。使用uint而不是int.

于 2016-01-22T03:55:04.960 回答