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