对超出 '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
。
但是当然不支持,因为 4294966272
在 0x7FFFFFFF
的 int
范围之外。此外,这不会是我唯一的手术。我还需要能够设置位 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。
或者,您可以将 big
和 little
定义为无符号。使用 uint
而不是 int
。
好的,让我们从一个 32 位整数开始:
int big = 536855551; // 00011111111111111100001111111111
现在,我想将最后 10 位设置在这个整数范围内:
int little = 69; // 0001101001
所以,我的方法是这样的:
big = (big & 4294966272) & (little)
其中 4294966272
是前 22 位,或 11111111111111111111110000000000
。
但是当然不支持,因为 4294966272
在 0x7FFFFFFF
的 int
范围之外。此外,这不会是我唯一的手术。我还需要能够设置位 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。
或者,您可以将 big
和 little
定义为无符号。使用 uint
而不是 int
。