Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中是否有容量大于u_long/UInt64的数字类型?_Swift - Fatal编程技术网

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

Swift中是否有容量大于u_long/UInt64的数字类型?,swift,Swift,在Swift中是否有容量大于u_long或UInt64的型号 我有一个函数,需要非常大的整数来识别28位的信用卡号码: func myFunc(number : /*What to put here?*/) { //body } 哪种类型比较合适?应该将数字视为字符串吗?信用卡号码不是数学意义上的数字。这是一个数字序列,CC应该被视为文本,就像电话号码一样。使用固定长度整数值的一个直接问题是,代码不能同时检测和跟踪“不再存在数字”中的零 使用字符串或表示CC编号的特定(自定义)类型,可

在Swift中是否有容量大于u_long或UInt64的型号

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

func myFunc(number : /*What to put here?*/) {
    //body
}
哪种类型比较合适?应该将数字视为字符串吗?

信用卡号码不是数学意义上的数字。这是一个数字序列,CC应该被视为文本,就像电话号码一样。使用固定长度整数值的一个直接问题是,代码不能同时检测和跟踪“不再存在数字”中的零

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


如果需要(并且在需要时),可以将CC编号(由真正的字符串表示)编码为适当的二进制表示。

您可以实现自己的
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 
}

我正在开发一个大数字库,你可以用它来做一些大数字计算。实际上,该库基于GNU多精度(GMP)库(请参阅:),我编写了一个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
您可以在以下位置找到该库:


我认为用远大于28位的偶数来计算“信用卡号”是相当容易的。

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

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

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

可以实现您自己的UInt128类型。或者您可以使用NSDecimalNumberHow实现UInt128?就像UInt64的实现方式一样。制作一个结构,遵守协议,实现必要的方法和运算符你能把它放在一个答案中吗?@user2864740除法和十的模,加上
Int(ceil(log10(Double(number)))
得到它的长度(以数字表示)很好的答案!转换为任何数字类型都会有前导零的问题,这在信用卡号码中很重要。Thanks@Carpsen90话虽如此,我自己从未见过这样的数字——但它是关于表示数据的。