对超出“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'
,这会更漂亮。
谢谢。
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
在位移位方面的一点区别。
或者,您可以将big
和little
定义为无符号。使用 uint
而不是 int
。