使用有符号整数的模数溢出

时间:2013-09-24 18:05:22

标签: c# bit-manipulation

我正在实现一堆不同类型的伪随机数生成器来玩。我注意到线性同余生成器的周期可以是int的大小,并且我认为我可以使用溢出而不是模数,看看它是否更快。

唯一的障碍是溢出溢出到符号位,我需要它们都是正值。

编辑:我在几个概念上多云,所以我正在清理这个问题,所以它更有意义。 基本上这一切归结为我试图砍掉一个整数的符号位。我发现用int.MinValue对数字进行异或操作就可以了。但只有当它已经溢出时,如果它没有相反的情况。我想避免使用额外的if语句。

如果有人可以向我展示一些巧妙的技巧来阻止前31位并将它们填充为整数,那将是令人愉快的。或者将符号位设置为零的某种方式可能更好?

2 个答案:

答案 0 :(得分:3)

如果你希望溢出从零开始,你应该屏蔽掉符号位。

unchecked {
    int x = int.MaxValue + 5;
    int y = x & 0x7fffffff;
}
Console.WriteLine(y);

输出数字4。

我不认为溢出值的绝对值会给你你想要的东西(你会上升到maxint,然后下降,加上,你必须专门处理int.MaxValue + 1,因为它equals int.MinValue,Math.Abs​​()将抛出异常。

unchecked {
    int x = int.MaxValue + 5;
    int y = Math.Abs(x);
}
Console.WriteLine(y);

输出数字2147483644。

答案 1 :(得分:0)

你的意思是:

int x = -100;

int mask = (x >> 31);
Trace.WriteLine((x + mask) ^ mask);

output: 100