ZetCode

Dart BigInt

最后修改于 2025 年 6 月 8 日

在 Dart 中,BigInt 是一种表示任意精度整数的数据类型,允许开发人员处理大于 64 位的值。与具有基于系统架构的固定大小限制的标准 int 不同,BigInt 可以存储极其大的值而不会溢出,这对于需要高精度计算的应用程序至关重要。

BigInt 在数值较大的领域尤其有用,例如:

BigInt 是 Dart 核心库的一部分,这意味着它可以在没有额外依赖的情况下使用。它提供了一套丰富的数学运算,类似于常规整数,包括:

BigInt 类提供了用于基本算术、位运算和模运算的方法,使开发人员能够高效准确地处理大数。

通过利用 BigInt,开发人员可以执行精确计算而无需担心整数溢出,使其成为需要高精度数字处理的应用程序的关键工具。

创建 BigInt 值

可以使用 BigInt 构造函数或 parse 方法创建 BigInt 值。也支持带有 'n' 后缀的字面量语法。

main.dart
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 支持所有标准的算术运算,如加法、减法、乘法和除法。除法返回截断的整数结果。

main.dart
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 值。它们还提供 isEvenisOddsign 等属性。

main.dart
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 和移位。这些对于底层编程和密码学很有用。

main.dart
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 提供了模运算方法,包括 powmodPow,它们对于加密算法至关重要。

main.dart
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

最佳实践

来源

Dart BigInt 文档

本教程涵盖了 Dart 的 BigInt,并通过实际示例演示了其关键功能和用于任意精度算术的用法模式。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有超过十年的经验。

列出 所有 Dart 教程