0

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

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

编辑:我对几个概念很模糊,所以我正在清理这个问题,所以它更有意义。基本上这一切都归结为我试图去掉整数的符号位。我发现用 int.MinValue 对数字进行异或运算就可以了。但只有当它溢出时,如果它没有溢出,则相反。不过,我想避免额外的 if 语句。

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

4

2 回答 2

3

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

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

这将输出数字 4。

我不认为溢出值的绝对值会给你你想要的(你会上升到 maxint,然后再下降,另外,你必须特别处理 int.MaxValue + 1 因为它等于 int。 MinValue,Math.Abs​​() 将抛出异常)。

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

这将输出数字 2147483644。

于 2013-09-24T19:13:55.377 回答
0

你的意思是:

int x = -100;

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

output: 100
于 2013-09-24T18:18:54.390 回答