.net 如何将一个BigInteger截断为int/long/uint/ulong?

bq3bfh9z  于 2023-01-06  发布在  .NET
关注(0)|答案(2)|浏览(121)

BigInteger到固定大小整数的标准转换都会在数字太大时抛出OverflowException(以及unchecked doesn't work)。
如何获得类似unchecked的转换行为?

js5cn81o

js5cn81o1#

您可以通过屏蔽高位来截断BigInteger。例如,给定BigInteger big

  • 使用(uint)(big & uint.MaxValue)转换为uint
  • 使用(ulong)(big & ulong.MaxValue)转换为ulong
  • 使用unchecked((int)(uint)(big & uint.MaxValue))转换为int
  • 使用unchecked((long)(ulong)(big & ulong.MaxValue))转换为long

这种技术效率不高;它需要两次内存分配(一个用于将uint.MaxValue转换为BigInteger,另一个用于保存&操作的结果).但是我看不出有其他的方法.然而,当掩码小于32位时(例如,用(ushort)(big & ushort.MaxValue)转换为ushort不应分配内存),因为BigInteger不为31位或更小的数字分配内存。

odopli94

odopli942#

更快的方法:

public static int ToInt(this BigInteger big) {
    return BitConverter.ToInt32(big.ToByteArray().AsSpan(0, 4)); }

longuint等的解决方案非常简单。

相关问题