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

Swift 将位的文本整数表示转换为实际位的最快方法?,swift,math,integer,bit,Swift,Math,Integer,Bit,例如,我以文本形式将8位整数的位表示为10010111,(也是一个整数,但在源代码文件中表示为文本) 给定预先的大小(为了说明前缀为零),将字节的文本整数表示转换为它所表示的实际位的最快方法是什么?我不想把它转换成一个字符串,并反复使用它,我相信一定有一些数学技巧 10010111被翻译成-105,一种Int8 我不希望使用文字进行转换。我的整数的值在编译时未知。[Edit2] 创建具有每个可能的半字节(4位块)的十进制表示的表 tab[16]={0,1,10,1110010111011111

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

给定预先的大小(为了说明前缀为零),将字节的文本整数表示转换为它所表示的实际位的最快方法是什么?我不想把它转换成一个
字符串
,并反复使用它,我相信一定有一些数学技巧

10010111
被翻译成
-105
,一种
Int8


我不希望使用文字进行转换。我的整数的值在编译时未知。[Edit2]

  • 创建具有每个可能的半字节(4位块)的十进制表示的表

    • tab[16]={0,1,10,111001011101111100010011010101111101111}
    • 如果要按不同的位大小进行处理,请相应地更改表的大小
  • 现在处理所有笔尖

    • 从LSB到MSB提取每个nibel
    • 并将其在decadic中的值添加到输出值中
    • for(out=0,b=1;in;in>=4,b*=10000)out+=tab[in&15]*b
    • out
      是输出值
    • 中的
      是输入值
    • b
      是笔尖的重量
      {110000100000000,…}
    • >=
      是向同一变量右移的位
    • +=
      添加到同一变量
    • &15中的
      in
      是逻辑的
      并且
      只在
      中保留
      的最低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
    
    具有256个条目,因此每次转换仅为一次 查字典。对于较大的数字,可以进行转换
    以8位块完成。

    什么样的“文本表示”不是字符串?
    10010111
    是一个整数,但当我在IDE中编写代码时,它是以文本表示的。我希望能够将这个“文本整数表示”(重点是整数)转换为它表示的数据。也许你可以建议对我的问题进行编辑,使之更清楚?这是令人沮丧的。我几乎建议取对数基数10,然后将2提高到结果的幂。不起作用。斯佩克特的方法是我所知道的最好的。或者,如果您想将数字作为一个整数处理而不转换为字符数组,您可以通过取模10得到最低有效位,再除以10右移1位小数来处理。我不认为这会像使用字符数组一样快。但不管怎样,似乎一个人一次只能处理一个位置值的转换。这很令人伤心。我已经知道@Spektre's,这实际上是我目前的方法,但我正在寻找更快的方法。不。我有一个数字,我想要另一个数字和我的第一个数字文本表示的位。这是一个完全不同的问题。。。类似于BCD,但在二进制中我看到了,我认为您错过了“Swift”标记:p@VatsalManot为什么?算法与语言没有太大关系,如果我告诉C++如何用足够的文本来说明如何将它移植到你的平台上……因为我不熟悉SWIFT,我不能直接在其中编码。其他人可能会这样做,他们的答案会更好,但我只看到一个答案,它使用了您希望避免的字符串转换。如果您稍候,我将尝试在C++中转换这个代码(首先要测试它),如果您想以语言无关的形式回答,那么使用伪代码。如果我不熟悉您正在编程的语言,那么它可能是希腊语。对于记录,我确实知道C和一点点C++,但是它并没有改变你应该使用伪代码/ Swift.This是我目前的方法的事实。不过,我很希望避免使用字符串中间值。@VatsalManot:如果您在问题中展示了当前的方法,那会很有帮助:)-您认为这是性能问题吗?你测量过吗?这目前不是性能问题,但我很好奇是否存在更快的方法。@VatsalManot:在哪方面更好?更快的代码,更短的代码,…?我只是编辑我的评论来解决这个问题!谈谈巧合。
    let dict : [ Int : Int8 ] = [ 0: 0, 1: 1, 10: 2, 11: 3, 100: 4, ...]