Swift中是否存在容量大于 u_long 或 UInt64 的类型?
我有一个非常大的整数函数来识别28位数的信用卡号码:
func myFunc(number : /*What to put here?*/) {
//body
}
什么类型合适? number 应该被视为字符串吗?
答案 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
这具有理论上允许和无限数量的数字的优点,但缺点是字符串可能并不总是代表数字。