在Swift中是否存在容量大于u_long / UInt64的数字类型?

时间:2014-09-02 00:34:18

标签: swift

Swift中是否存在容量大于 u_long UInt64 的类型?

我有一个非常大的整数函数来识别28位数的信用卡号码:

func myFunc(number : /*What to put here?*/) {
    //body
}

什么类型合适? number 应该被视为字符串吗?

4 个答案:

答案 0 :(得分:13)

信用卡号码数字意义上的数字。这是一个数字序列, CC应被视为文本,非常类似于电话号码。使用固定长度整数值的一个直接问题是代码无法同时从“不再存在数字”中检测到leading和尾随零

使用表示CC编号的字符串或特定(自定义)类型,可能在内部使用字符串。数字的长度(以10为基数)通常是数字的位数:这是基础字符串的长度。

如果需要(和何时),CC编号(由真实字符串表示)以后可以编码成适当的二进制表示。

答案 1 :(得分:4)

您可以实施自己的UInt128类型。或者使用NSDecimalNumber

实施UInt128

struct UInt128 {
    var low : UInt64 = 0;
    var high : UInt64 = 0;
}

您可以实现运算符

infix func + (l: UInt128, r: UInt128) -> UInt128 {
    // do your work... care with overflow 
}

答案 2 :(得分:2)

我正在使用BigNumber库,您可以使用它来进行大量计算。实际上该库基于GNU多精度(GMP)库(参见:https://gmplib.org),我编写了一个Objective-C / Swift包装器。目前大整数数学,包括很多运算符重载,都是可能的。代码示例如下:

var err : NSError?
var bi1 = BigInt(nr: 12468642135797531)
var bi2 = BigInt(nr: "12345678901011121314151617181920", error: &err)
var res = bi1 * bi2
println("Multiply 2 BigInts: bi1 * bi2 = \(res.toString())")

导致:

Multiply 2 BigInts: bi1 * bi2 = 153933852140173822960829726365674325601913839520

您可以在https://github.com/githotto/osxgmp

找到该库

我认为很容易做一些信用卡号码'偶数的数学远远超过28位。

答案 3 :(得分:0)

另一种方法是使用字符串,并定义数学运算符以对字符串进行操作:

func +(lhs: String, rhs: Int8) -> String
func +(lhs: String, rhs: Int16) -> String
func +(lhs: String, rhs: Int32) -> String
func +(lhs: String, rhs: Int64) -> String
func +(lhs: String, rhs: String) -> String
// ... other operators

这具有理论上允许和无限数量的数字的优点,但缺点是字符串可能并不总是代表数字。