使用带有符号整数的模数溢出
本文关键字:溢出 整数 符号 | 更新日期: 2023-09-27 18:32:33
我正在实现一堆不同类型的伪随机数生成器来玩。我注意到线性同余生成器可以有整数大小的周期,并认为我可以使用溢出而不是模数,看看它是否更快。
唯一的障碍是溢出到符号位中,我需要它们都是正值。
编辑:我对几个概念很模糊,所以我正在清理这个问题,所以更有意义。基本上,这一切都归结为我试图删除整数的符号位。我发现用 int 对数字进行异或运算。MinValue可以解决问题。但只有当它溢出时,如果没有溢出,情况就会适得其反。不过,我想避免额外的 if 语句。
如果有人能向我展示一些漂亮的技巧来抓住前 31 位并将它们塞进一个整数中,那将是令人愉快的。或者某种将符号位设置为零的方法可能会更好?
如果你想让
溢出从零开始,你应该屏蔽符号位。
unchecked {
int x = int.MaxValue + 5;
int y = x & 0x7fffffff;
}
Console.WriteLine(y);
这将输出数字 4。
我不认为溢出值的绝对值会给你你想要的(你会上升到 maxint,然后下降回来,另外,你必须专门处理 int。最大值 + 1,因为它等于 int。MinValue,Math.Abs() 将在其上抛出异常)。
unchecked {
int x = int.MaxValue + 5;
int y = Math.Abs(x);
}
Console.WriteLine(y);
这将输出数字2147483644。
你的意思是:
int x = -100;
int mask = (x >> 31);
Trace.WriteLine((x + mask) ^ mask);
output: 100