如何在swift中创建接受任何类型的Int或Uint的函数 (并计算关于param类型的比特数)
答案 0 :(得分:28)
String
有构造函数
init<T : _SignedIntegerType>(_ v: T, radix: Int, uppercase: Bool = default)
init<T : _UnsignedIntegerType>(_ v: T, radix: Int, uppercase: Bool = default)
可以在这里使用:
let num = 100
let str = String(num, radix: 2)
print(str)
// Output: 1100100
答案 1 :(得分:3)
这是一个更短的版本。它不会添加额外的前导零:
func bitRep<T: IntegerArithmeticType>(value: T) -> String {
var n: IntMax = value.toIntMax()
var rep = ""
while(n > 0){
rep += "\(n % 2)"
n = n / 2;
}
return rep
}
答案 2 :(得分:1)
let binStr:Int->String = {a in return String(a, radix: 2)}
binStr(7) // "111"
答案 3 :(得分:0)
这是一个使用泛型的函数,以便接受任何类型的Int或Uint而不需要param转换。
1-该函数需要约束符合“ToInt”协议的值类型 为了提供一种将self类型转换为Int
的独特方法2-该函数计算关于参数类型的长度位需求
3-该函数每8位数插入一次空格以提供易读性
protocol ToInt { func toInt() -> Int }
extension UInt: ToInt { func toInt() -> Int { return Int(self) } }
extension Int8: ToInt { func toInt() -> Int { return Int(self) } }
extension UInt8: ToInt { func toInt() -> Int { return Int(self) } }
extension Int16: ToInt { func toInt() -> Int { return Int(self) } }
extension UInt16: ToInt { func toInt() -> Int { return Int(self) } }
extension Int32: ToInt { func toInt() -> Int { return Int(self) } }
extension UInt32: ToInt { func toInt() -> Int { return Int(self) } }
extension Int64: ToInt { func toInt() -> Int { return Int(self) } }
extension UInt64: ToInt { func toInt() -> Int { return Int(self) } }
func bitRep<T:ToInt>(value: T) -> String {
var size: Int
switch value {
case is Int8, is UInt8: size = 7
case is Int16, is UInt16: size = 15
case is Int32, is UInt32: size = 31
case is Int64, is UInt64: size = 63
default : size = 63
}
var n = value.toInt()
var rep = ""
for (var c = size; c >= 0; c--) {
var k = n >> c
if (k & 1) == 1 { rep += "1" } else { rep += "0" }
if c%8 == 0 && c != 0 { rep += " " }
}
return rep
}
一些例子:
let b1: UInt8 = 0b00000000
bitRep(b1)
// > "00000000"
let c1: UInt16 = 0b00000000_10000101
bitRep(c1)
// > "00000000 10000101"
let e1: UInt64 = 0b00000000_00000000_00000000_00000001
bitRep(e1)
// > "00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001"
等等!
(algo的灵感来自这个主题:Turning an integer to its binary representation using C?)