例如,我在文本上将8位整数位表示为10010111
,(也是整数,但在源代码文件中表示为文本)。
预先给定大小(为了说明前缀为零),将字节的文本整数表示转换为它所代表的实际位的最快方法是什么?我宁愿不把它转换成String
并重复一遍,我确定必须有一些数学技巧。
10010111
已翻译为-105
,Int8
。
我不希望使用文字进行转换。编译时不知道我的整数值。
答案 0 :(得分:4)
这是你在找什么?
let num = Int8(bitPattern: UInt8("10010111", radix: 2)!)
print(num) // -105
或者,如果将“表示”分配给整数:
let input = 10010111
let num = Int8(bitPattern: UInt8(String(input), radix: 2)!)
print(num) // -105
这使用中间字符串表示,但您没有 “手动”迭代它。
当然,如果存在无效的二进制文件,这两种方法都会崩溃 数字或溢出,所以你应该使用可选的绑定。
转换也可以使用纯整数运算来完成 和位移,不使用字符串:
var input = 10010111
var num : Int8 = 0
var mask : Int8 = 1
while input > 0 {
if input % 10 != 0 {
num |= mask
}
mask <<= 1
input /= 10
}
print(num) // -105
我接下来测量哪种方法更快:)
如果输入限制为8位,那么最快的方法就是 可能是要定义字典
let dict : [ Int : Int8 ] = [ 0: 0, 1: 1, 10: 2, 11: 3, 100: 4, ...]
有256个条目,因此每次转换只是一个 字典查找。对于更大的数字,转换可以是 以8位块完成。
答案 1 :(得分:1)
<强> [EDIT2] 强>
使用每个可能的nibel(4位块)的十进制表示创建表
tab[16]= { 0,1,10,11,100,101,110,111,1000,1001,1010,1011,1100,1101,1110,1111 };
现在处理所有的nibels
for (out=0,b=1;in;in>>=4,b*=10000) out+=tab[in&15]*b;
out
是输出值in
是输入值b
是nibel { 1,10000,100000000,... }
>>=
向右移位到同一个变量+=
添加到同一个变量in&15
符合逻辑AND
只留下in
的最低4位