将位的文本整数表示转换为实际位的最快方法?

时间:2015-09-19 07:15:14

标签: swift math integer bit

例如,我在文本上将8位整数位表示为10010111,(也是整数,但在源代码文件中表示为文本)。

预先给定大小(为了说明前缀为零),将字节的文本整数表示转换为它所代表的实际位的最快方法是什么?我宁愿不把它转换成String并重复一遍,我确定必须有一些数学技巧。

10010111已翻译为-105Int8

我不希望使用文字进行转换。编译时不知道我的整数值。

2 个答案:

答案 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]

  1. 使用每个可能的nibel(4位块)的十进制表示创建表

    • tab[16]= { 0,1,10,11,100,101,110,111,1000,1001,1010,1011,1100,1101,1110,1111 };
    • 如果您想按不同的位大小进行处理,请相应地更改表的大小
  2. 现在处理所有的nibels

    • 从LSB提取每个nibel到MSB
    • 并将其十进制值添加到输出值
    • 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位