BigInteger

BigInteger

> LeekScript

BigIntegerLeekScript 在 2.48 更新中新增的一种类型。它是一种新的基本类型,与其他现有类型兼容,特别有助于创建和优化位图

定义

BigInteger 是一种整数,行为几乎与 Integer 相同,但可以大得多:经典的 Integer 限制在 64 位(263-1),而 BigInteger 最多可以容纳 1 048 576 位(220),约合 315 000 位十进制数字。超过这个上限,计算会以 OUT_OF_MEMORY 错误失败。

注意: 这个类型并不是要在所有地方取代现有类型(因为它消耗更多操作,也占用更多内存)。它对解决邪恶南瓜的谜题没有帮助。

用法

声明

用字母 L 来表示一个数是 BigInteger。字面量中允许使用分隔符 _,以提高可读性:

var a = 1L var b = 0b111L big_integer c = 5 big_integer d = -3L var e = 1_000_000L

构造函数 BigInteger() 创建一个值为 0 的 BigInteger,运算符 instanceof 可用来检测一个值的类型:

var x = BigInteger() debug(x instanceof BigInteger) // true

注意,大数不会被自动识别:没有后缀 L 时,一个对 Integer 来说过大的字面量会变成 Real(并损失精度)。只有后缀 L 或类型 big_integer 才会创建 BigInteger:

var a = 123445321324234567895431235648945674894561564523489756489 // Real : 1.2344532132423457E56 var b = 1 >> 的行为与 >> 相同(算术移位:保留符号)。而运算符 / 的行为与其他数字一样,返回 Real15L / 4L 等于 3.75);只有 \ 才进行整数除法(15L \ 4L 等于 3`)。 含有 BigInteger 的运算通常会得到 BigInteger 类型的结果:

var a = 5.0 + 5L // BigInteger var b = 123456789123456789L % 234567 // BigInteger

操作内存的开销与操作数的大小成正比——对于 \%*,则与两个操作数大小的乘积成正比:

var a = 2L * 200_000 // 约 1 221 000 次操作:结果有 200 001 位 var b = 2L * 200_000_000 // 几乎不花任何开销……因为它会崩溃:结果将超过 1 048 576 位的上限(OUT_OF_MEMORY)

显示

非常大的数在显示时会被截断,以减少计算量并避免刷屏(函数 binStringhexString 会完整显示,开销相应调整):

debug(1L >>>>` 消耗的操作数更少。

其他有用的函数