public struct BigInt <: Comparable<BigInt> & Hashable & ToString
功能:BigInt 定义为任意精度(二进制)的有符号整数。仓颉的 struct BigInt 用于任意精度有符号整数的计算,类型转换等。
public prop bitLen: Int64
功能:获取此 BigInt 的最短 bit 长度。如 -3 (101) 返回 3,-1 (11) 返回 2,0 (0) 返回 1。
类型:Int64
public init(bytes: Array<Byte>)
功能:通过大端的 Byte 数组以补码形式构建一个 BigInt 结构体。
数据存储方法有以下两种:
参数:
异常:
public init(sign: Bool, magnitude: Array<Byte>)
功能:通过符号位和真值的绝对值构建一个 BigInt 结构体。视空数组为 0。
参数:
异常:
public init(sign: Bool, bitLen: Int64, rand!: Random = Random())
功能:通过指定正负、bit 长度和随机数种子构建一个随机的 BigInt 结构体。bit 长度需要大于 0。
参数:
异常:
public init(n: IntNative)
功能:通过平台相关有符号整数构建一个 BigInt 结构体。
参数:
public init(s: String, base!: Int64 = 10)
功能:通过字符串和进制构建一个 BigInt 结构体,支持 2 进制到 36 进制。
字符串的规则如下,即开头是可选的符号(正号或负号),接一串字符串表示的数字:
IntegerString : (SignString)? ValueString
参数:
异常:
public init(n: UIntNative)
功能:通过平台相关无符号整数构建一个 BigInt 结构体。
参数:
public static func randomProbablePrime(bitLen: Int64, certainty: UInt64, rand!: Random = Random()): BigInt
功能:通过可选的随机数种子构建一个随机的 BigInt 素数,素数的 bit 长度不超过入参 bitLen。
显然,素数必定是大于等于 2 的整数,因此 bitLen 必须大于等于 2。素数检测使用 Miller-Rabin 素数测试算法。Miller-Rabin 测试会有概率将一个合数判定为素数,其出错概率随着入参 certainty 的增加而减少。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let randomProbablePrime = BigInt.randomProbablePrime(6, 3)
println(randomProbablePrime)
} 运行结果:
11
public func clearBit(index: Int64): BigInt
功能:通过将指定索引位置的 bit 修改为 0 来构造一个新 BigInt。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(1024)
let clearBit = bigInt.clearBit(10)
println(clearBit)
} 运行结果:
0
public func divAndMod(that: BigInt): (BigInt, BigInt)
功能:BigInt 的除法运算。
与另一个 BigInt 相除,返回商和模。此除法运算的行为与基础类型保持一致,即商向靠近 0 的方向取整,模的符号与被除数保持一致。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(1025)
let that = BigInt(512)
let (div, mod) = bigInt.divAndMod(that)
println(div)
println(mod)
} 运行结果:
2 1
public func flipBit(index: Int64): BigInt
功能:通过翻转指定索引位置的 bit 来构造一个新 BigInt。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(1024)
let flipBit = bigInt.flipBit(10)
println(flipBit)
} 运行结果:
0
public func hashCode(): Int64
功能:计算并返回此 BigInt 的哈希值。
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(1024)
let hashCode = bigInt.hashCode()
println(hashCode)
} 运行结果:
1024
public func isProbablePrime(certainty: UInt64): Bool
功能:判断一个数是不是素数。
该函数使用了 Miller-Rabin 测试算法,此算法的准确率会随着 certainty 参数的增加而增加。如果该数是素数,那么 Miller-Rabin 测试必定返回 true;如果该数是合数(期待返回 false),那么会有低于 1/4certainty 概率返回 true。素数只对大于等于 2 的正整数有意义,即负数,0,1 都不是素数。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(1024)
let isProbablePrime = bigInt.isProbablePrime(10)
println(isProbablePrime)
} 运行结果:
false
public func lowestOneBit(): Int64
功能:判断为 1 的最低位的 bit 的位置。
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(-1)
let lowestOneBit = bigInt.lowestOneBit()
println(lowestOneBit)
} 运行结果:
0
public func modInverse(that: BigInt): BigInt
功能:求模逆元。
模逆元 r 满足 $(this * r) % that == 1$。显然,this 和 that 必须互质。当 that 为 正负 1 时,结果总是 0。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(1025)
let that = BigInt(512)
let modInverse = bigInt.modInverse(that)
println(modInverse)
} 运行结果:
1
public func modPow(n: BigInt, m!: ?BigInt = None): BigInt
功能:计算此 BigInt 的 n 次幂模 m 的结果,并返回。
模的规则与基础类型一致,即模的符号与被除数保持一致。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(2)
let n = BigInt(10)
let modPow = bigInt.modPow(n)
println(modPow)
} 运行结果:
1024
public func quo(that: BigInt): BigInt
功能:BigInt 的除法运算。
与另一个 BigInt 相除,返回结果。此除法运算的行为与运算符重载函数区别于,如果被除数为负数,此函数的结果向着远离 0 的方向取整,保证余数大于等于 0。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(1025)
let that = BigInt(512)
let quo = bigInt.quo(that)
println(quo)
} 运行结果:
2
public func quoAndRem(that: BigInt): (BigInt, BigInt)
功能:BigInt 的除法运算。
与另一个 BigInt 相除,返回商和余数。此除法运算的行为与 divAndMod 函数区别于,如果被除数为负数,此函数的结果向着远离 0 的方向取整,保证余数总是大于等于 0。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(1025)
let that = BigInt(512)
let (quo, rem) = bigInt.quoAndRem(that)
println(quo)
println(rem)
} 运行结果:
2 1
public func rem(that: BigInt): BigInt
功能:BigInt 的模运算。
与另一个 BigInt 相除,返回余数。余数的结果总是大于等于 0。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(1025)
let that = BigInt(512)
let rem = bigInt.rem(that)
println(rem)
} 运行结果:
1
public func setBit(index: Int64): BigInt
功能:通过将指定索引位置的 bit 修改为 1 来构造一个新 BigInt。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(0)
let setBit = bigInt.setBit(10)
println(setBit)
} 运行结果:
1024
public func testBit(index: Int64): Bool
功能:判断指定位置的 bit 信息,如果指定位置的 bit 为 0,则返回 false;为 1,则返回 true。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(-1)
let testBit = bigInt.testBit(100)
println(testBit)
} 运行结果:
true
public func toBytes(): Array<Byte>
功能:计算并返回此 BigInt 的大端补码字节数组。
字节数组最低索引的最低位为符号位,如 128 返回 [0, 128](符号位为 0),-128 返回 [128](符号位为 1)。
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(0x400)
let toBytes = bigInt.toBytes()
println(toBytes)
} 运行结果:
[4, 0]
public func toInt16(overflowHandling!: OverflowStrategy = throwing): Int16
功能:将当前 BigInt 对象转化为 Int16 类型,支持自定义溢出策略。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy
main() {
let bigInt = BigInt(0x8000_0000_0000)
let toInt16 = bigInt.toInt16(overflowHandling: saturating)
println(toInt16)
} 运行结果:
32767
public func toInt32(overflowHandling!: OverflowStrategy = throwing): Int32
功能:将当前 BigInt 对象转化为 Int32 类型,支持自定义溢出策略。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy
main() {
let bigInt = BigInt(0x8000_0000_00FF)
let toInt32 = bigInt.toInt32(overflowHandling: wrapping)
println(toInt32)
} 运行结果:
255
public func toInt64(overflowHandling!: OverflowStrategy = throwing): Int64
功能:将当前 BigInt 对象转化为 Int64 类型,支持自定义溢出策略。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy
main() {
let bigInt = BigInt("800000000000000000", base: 16)
let toInt64 = bigInt.toInt64(overflowHandling: wrapping)
println(toInt64)
} 运行结果:
0
public func toInt8(overflowHandling!: OverflowStrategy = throwing): Int8
功能:将当前 BigInt 对象转化为 Int8 类型,支持自定义溢出策略。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy
main() {
let bigInt = BigInt(1024)
let toInt8 = bigInt.toInt8(overflowHandling: saturating)
println(toInt8)
} 运行结果:
127
public func toIntNative(overflowHandling!: OverflowStrategy = throwing): IntNative
功能:将当前 BigInt 对象转化为 IntNative 类型,支持自定义溢出策略。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy
main() {
let bigInt = BigInt("800000000000000000", base: 16)
let toIntNative = bigInt.toIntNative(overflowHandling: wrapping)
println(toIntNative)
} 运行结果:
0
public func toString(): String
功能:计算并返回此 BigInt 的十进制字符串表示。
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(0x400)
let toString = bigInt.toString()
println(toString)
} 运行结果:
1024
public func toString(base: Int64): String
功能:计算并返回此 BigInt 的任意进制字符串表示。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt(0x400)
let toString = bigInt.toString(2)
println(toString)
} 运行结果:
10000000000
public func toUInt16(overflowHandling!: OverflowStrategy = throwing): UInt16
功能:将当前 BigInt 对象转化为 UInt16 类型,支持自定义溢出策略。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy
main() {
let bigInt = BigInt("800000000000000000", base: 16)
let toUInt16 = bigInt.toUInt16(overflowHandling: wrapping)
println(toUInt16)
} 运行结果:
0
public func toUInt32(overflowHandling!: OverflowStrategy = throwing): UInt32
功能:将当前 BigInt 对象转化为 UInt32 类型,支持自定义溢出策略。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy
main() {
let bigInt = BigInt("800000000000000000", base: 16)
let toUInt32 = bigInt.toUInt32(overflowHandling: wrapping)
println(toUInt32)
} 运行结果:
0
public func toUInt64(overflowHandling!: OverflowStrategy = throwing): UInt64
功能:将当前 BigInt 对象转化为 UInt64 类型,支持自定义溢出策略。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy
main() {
let bigInt = BigInt("-800000000000000000", base: 16)
let toUInt64 = bigInt.toUInt64(overflowHandling: saturating)
println(toUInt64)
} 运行结果:
0
public func toUInt8(overflowHandling!: OverflowStrategy = throwing): UInt8
功能:将当前 BigInt 对象转化为 UInt8 类型,支持自定义溢出策略。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy
main() {
let bigInt = BigInt("800000000000000000", base: 16)
try {
bigInt.toUInt8(overflowHandling: throwing)
} catch (e: OverflowException) {
println(e.message)
}
return
} 运行结果:
Out of range of the UInt8
public func toUIntNative(overflowHandling!: OverflowStrategy = throwing): UIntNative
功能:将当前 BigInt 对象转化为 UIntNative 类型,支持自定义溢出策略。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy
main() {
let bigInt = BigInt("-800000000000000000", base: 16)
let toUIntNative = bigInt.toUIntNative(overflowHandling: saturating)
println(toUIntNative)
} 运行结果:
0
public operator func !(): BigInt
功能:按位非。将操作数中的二进制位 0 变 1,1 变 0。
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-1")
let no = !bigInt
println(no)
} 运行结果:
0
public operator func !=(that: BigInt): Bool
功能:判不等运算。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-1")
let that = BigInt("-2")
println(bigInt != that)
} 运行结果:
true
public operator func %(that: BigInt): BigInt
功能:BigInt 的模运算。
取模运算的行为与基础类型保持一致,即符号与被除数保持一致。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-23456789123456789")
let that = BigInt("-23456789123456789")
let mod = bigInt % that
println(mod)
} 运行结果:
0
public operator func &(that: BigInt): BigInt
功能:按位与。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位都为 1 时,结果位才为 1。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("8")
let that = BigInt("7")
let and = bigInt & that
println(and)
} 运行结果:
0
public operator func *(that: BigInt): BigInt
功能:BigInt 乘法。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-1")
let that = BigInt("-23456789123456789")
let mul = bigInt * that
println(mul)
} 运行结果:
23456789123456789
public operator func **(n: UInt64): BigInt
功能:求 BigInt 的 n 次幂。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-2")
let power = bigInt ** 64
println(power.toString(16))
} 运行结果:
10000000000000000
public operator func +(that: BigInt): BigInt
功能:BigInt 加法。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("123456789123456789")
let that = BigInt("-23456789123456789")
let plus = bigInt + that
println(plus)
} 运行结果:
100000000000000000
public operator func -(): BigInt
功能:求 BigInt 的相反数。
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-23456789123456789")
let opposite = -bigInt
println(opposite)
} 运行结果:
23456789123456789
public operator func -(that: BigInt): BigInt
功能:BigInt 减法。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("100000000000000000")
let that = BigInt("-23456789123456789")
let sub = bigInt - that
println(sub)
} 运行结果:
123456789123456789
public operator func <(that: BigInt): Bool
功能:小于比较运算。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-1")
let that = BigInt("-2")
println(bigInt < that)
} 运行结果:
false
public operator func <<(n: Int64): BigInt
功能:左移运算。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-1")
let leftShift = bigInt << 64
println(leftShift.toString(16))
} 运行结果:
-10000000000000000
public operator func <=(that: BigInt): Bool
功能:小于等于比较运算。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-1")
let that = BigInt("-2")
println(bigInt <= that)
} 运行结果:
false
public operator func ==(that: BigInt): Bool
功能:判等运算。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-1")
let that = BigInt("-2")
println(bigInt == that)
} 运行结果:
false
public operator func >(that: BigInt): Bool
功能:大于比较运算。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-1")
let that = BigInt("-2")
println(bigInt > that)
} 运行结果:
true
public operator func >=(that: BigInt): Bool
功能:大于等于比较运算。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-1")
let that = BigInt("-2")
println(bigInt >= that)
} 运行结果:
true
public operator func >>(n: Int64): BigInt
功能:右移运算。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-1")
let rightShift = bigInt >> 10000
println(rightShift)
} 运行结果:
-1
public operator func /(that: BigInt): BigInt
功能:BigInt 除法。
除法运算的行为与基础类型保持一致,即结果向靠近 0 的方向取整。
参数:
返回值:
异常:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-23456789123456789")
let that = BigInt("-23456789123456789")
let div = bigInt / that
println(div)
} 运行结果:
1
public operator func ^(that: BigInt): BigInt
功能:按位异或。其功能是参与运算的两数各对应的二进位相异或。二进制位结果不相同时,异或结果为 1;二进制位结果相同时,异或结果为 0。
参数:
返回值:
示例:
import std.math.numeric.BigInt
main() {
let bigInt = BigInt("-1")
let that = BigInt("7")
let xor = bigInt ^ that
println(xor)
} 运行结果:
-8