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

Fastest way to convert a textual integer representation of bits to actual bits?

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

预先给定大小(为了考虑前缀零),将字节的文本整数表示转换为它表示的实际位的最快方法是什么?我宁愿不将其转换为 String 并对其进行迭代,我确定其中一定有一些数学技巧。

10010111被翻译成-105,一个Int8.

我不想使用文字进行转换。我的整数的值在编译时是未知的。

[编辑2]

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

    • tab[16]= { 0,1,10,11,100,101,110,111,1000,1001,1010,1011,1100,1101,1110,1111 };
    • 如果您想按不同的位大小进行处理,请相应地更改 table 的大小
  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 位

这是您要找的吗?

let num = Int8(bitPattern: UInt8("10010111", radix: 2)!)
print(num) // -105

或者,如果 "representation" 被分配给一个整数:

let input = 10010111
let num = Int8(bitPattern: UInt8(String(input), radix: 2)!)
print(num) // -105

这使用中间字符串表示,但您没有 "manually" 遍历它。

当然,如果二进制文件无效,这两种方法都会崩溃 数字或溢出,因此您应该改用可选绑定。

转换也可以用纯整数运算来完成 和移位,不使用字符串:

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 位块完成。