将位的文本整数表示形式转换为实际位的最快方法?
Fastest way to convert a textual integer representation of bits to actual bits?
例如,我在文本上将一个 8 位整数的位表示为 10010111
,(也是一个整数,但在我的源代码文件中表示为文本) .
预先给定大小(为了考虑前缀零),将字节的文本整数表示转换为它表示的实际位的最快方法是什么?我宁愿不将其转换为 String
并对其进行迭代,我确定其中一定有一些数学技巧。
10010111
被翻译成-105
,一个Int8
.
我不想使用文字进行转换。我的整数的值在编译时是未知的。
[编辑2]
创建 table 每个可能的 nibel(4 位块)的十进制表示
tab[16]= { 0,1,10,11,100,101,110,111,1000,1001,1010,1011,1100,1101,1110,1111 };
- 如果您想按不同的位大小进行处理,请相应地更改 table 的大小
现在处理所有 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 位块完成。
例如,我在文本上将一个 8 位整数的位表示为 10010111
,(也是一个整数,但在我的源代码文件中表示为文本) .
预先给定大小(为了考虑前缀零),将字节的文本整数表示转换为它表示的实际位的最快方法是什么?我宁愿不将其转换为 String
并对其进行迭代,我确定其中一定有一些数学技巧。
10010111
被翻译成-105
,一个Int8
.
我不想使用文字进行转换。我的整数的值在编译时是未知的。
[编辑2]
创建 table 每个可能的 nibel(4 位块)的十进制表示
tab[16]= { 0,1,10,11,100,101,110,111,1000,1001,1010,1011,1100,1101,1110,1111 };
- 如果您想按不同的位大小进行处理,请相应地更改 table 的大小
现在处理所有 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 位块完成。