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 教程。