Dart BigInt
最后修改于 2025 年 6 月 8 日
在 Dart 中,BigInt
是一种表示任意精度整数的数据类型,允许开发人员处理大于 64 位的值。与具有基于系统架构的固定大小限制的标准 int
不同,BigInt
可以存储极其大的值而不会溢出,这对于需要高精度计算的应用程序至关重要。
BigInt
在数值较大的领域尤其有用,例如:
- 密码学 - 安全加密算法通常需要大素数。
- 科学计算 - 模拟天文距离或分子结构。
- 区块链和哈希 - 管理大型加密哈希和区块链计算。
BigInt
是 Dart 核心库的一部分,这意味着它可以在没有额外依赖的情况下使用。它提供了一套丰富的数学运算,类似于常规整数,包括:
BigInt
类提供了用于基本算术、位运算和模运算的方法,使开发人员能够高效准确地处理大数。
- 基本算术:加法 (+)、减法 (-)、乘法 (*)、除法 (~/)
- 位运算:AND (&)、OR (|)、XOR (^)、移位 (<<,>>)
- 模运算:
modPow()
用于幂运算,modInverse()
用于模逆运算 - 比较方法:
compareTo()
、isEven
、isOdd
、isNegative
通过利用 BigInt
,开发人员可以执行精确计算而无需担心整数溢出,使其成为需要高精度数字处理的应用程序的关键工具。
创建 BigInt 值
可以使用 BigInt 构造函数或 parse 方法创建 BigInt 值。也支持带有 'n' 后缀的字面量语法。
void main() { var big1 = BigInt.from(123456789); var big2 = BigInt.parse('98765432109876543210'); print(big1); print(big2); }
这展示了创建 BigInt
值的两种方法。第一种使用 BigInt.from
来转换一个 int,而第二种使用 BigInt.parse
来转换一个大数的字符串表示。
$ dart main.dart 123456789 98765432109876543210
基本算术运算
BigInt 支持所有标准的算术运算,如加法、减法、乘法和除法。除法返回截断的整数结果。
void main() { var a = BigInt.parse('12345678901234567890'); var b = BigInt.parse("987654321"); print('Addition: ${a + b}'); print('Subtraction: ${a - b}'); print('Multiplication: ${a * b}'); print('Division: ${a ~/ b}'); print('Remainder: ${a % b}'); }
我们对两个大的 BigInt 值执行基本算术运算。注意使用 ~/ 进行整数除法。常规的 / 会需要转换为 double。
$ dart main.dart Addition: 12345678902222222211 Subtraction: 12345678900246913569 Multiplication: 12193263112482853211126352690 Division: 12499999887 Remainder: 339506163
比较和属性
可以使用标准运算符比较 BigInt 值。它们还提供 isEven
、isOdd
和 sign
等属性。
void main() { var x = BigInt.parse('12345678901234567890'); var y = BigInt.parse('98765432109876543210'); print('x < y: ${x < y}'); print('x == y: ${x == y}'); print('x.isEven: ${x.isEven}'); print('y.isOdd: ${y.isOdd}'); print('x.sign: ${x.sign}'); print('y.bitLength: ${y.bitLength}'); }
我们比较两个 BigInt
值并检查它们的属性。bitLength
返回存储数字所需的最小位数。
$ dart main.dart x < y: true x == y: false x.isEven: true y.isOdd: false x.sign: 1 y.bitLength: 67
位运算
BigInt 支持位运算,如 AND、OR、XOR 和移位。这些对于底层编程和密码学很有用。
void main() { var a = BigInt.parse('0xFF00FF00FF00FF00FF'); var b = BigInt.parse('0x00FF00FF00FF00FF00'); print('AND: ${a & b}'); print('OR: ${a | b}'); print('XOR: ${a ^ b}'); print('NOT a: ${~a}'); print('Shift left: ${a << 4}'); print('Shift right: ${a >> 8}'); }
我们对十六进制 BigInt
值执行各种位运算。结果显示了每种运算如何影响二进制表示。
$ dart main.dart AND: 0 OR: 4722366482869645213695 XOR: 4722366482869645213695 NOT a: -4703991516010230251776 Shift left: 75263864256163684028400 Shift right: 18374966859414961920
模运算
BigInt 提供了模运算方法,包括 pow
和 modPow
,它们对于加密算法至关重要。
void main() { var base = BigInt.from(5); var exponent = BigInt.from(100); var modulus = BigInt.from(101); print('5^100: ${base.pow(100)}'); print('5^100 mod 101: ${base.modPow(exponent, modulus)}'); print('Modular inverse of 5 mod 101: ${base.modInverse(modulus)}'); }
我们演示了幂运算和模运算。modPow
在模数下高效地计算大指数。modInverse
查找模乘法逆元。
$ dart main.dart 5^100: 7888609052210118054117285652827862296732064351090230047702789306640625 5^100 mod 101: 1 Modular inverse of 5 mod 101: 81
最佳实践
- 性能: 尽可能使用常规 int,因为
BigInt
速度较慢。 - 内存:
BigInt
比常规整数占用更多内存。 - 转换: 需要时显式地在 int 和
BigInt
之间进行转换。 - 错误处理: 解析时处理潜在的 FormatException。
来源
本教程涵盖了 Dart 的 BigInt
,并通过实际示例演示了其关键功能和用于任意精度算术的用法模式。
作者
列出 所有 Dart 教程。