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

本文关键字:整数 位操作 范围 int | 更新日期: 2023-09-27 18:31:20

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

int big = 536855551; // 00011111111111111100001111111111

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

int little = 69; // 0001101001

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

big = (big & 4294966272) & (little)

其中4294966272是前 22 位,即 11111111111111111111110000000000 位。

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

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

因此,在解释不碍事的情况下,这是我正在做的作为上述替代方案:

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

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

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

谢谢。

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

4294966272实际上应该-1024,表示为11111111111111111111110000000000

例如:

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

虽然,结果将始终为 0

00011111111111111100001111111111
&
00000000000000000000000001101001
&
11111111111111111111110000000000

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

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

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

只是要注意无符号和有符号int在位移位方面的一点区别。

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