对超出 'int' 范围的大整数进行位操作

Bit manipulation on large integers out of 'int' range

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

int big = 536855551; // 00011111111111111100001111111111

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

int little = 69; // 0001101001

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

big = (big & 4294966272) & (little)

其中 4294966272 是前 22 位,或 11111111111111111111110000000000

但是当然不支持,因为 42949662720x7FFFFFFFint 范围之外。此外,这不会是我唯一的手术。我还需要能够设置位 11 到 14。我的方法(有同样的问题)是:

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

因此,在解释清楚的情况下,这是我正在做的作为上述替代方法的方法:

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

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

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

谢谢。

4294966272其实应该是-1024,表示为11111111111111111111110000000000.

例如:

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

不过,结果总是0

00011111111111111100001111111111
&
00000000000000000000000001101001
&
11111111111111111111110000000000

与 bit-shift + 掩码(即 &)相比,位移通常更快。我有一个

您应该选择第一个备选方案。

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

当涉及到 bit-shifting 时,请注意未签名和已签名 int 之间的 a little difference

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