如何有效地将8个17位整数转换为17个8位整数

xfb*_*fbs 3 c++ integer

好吧,我有以下问题:我有一组8个(无符号)数字都是17位(也就是说它们都不比131071大).由于17位数字是恼人的工作(将它们保存在32位int中是浪费空间),我想将它们变成17个8位数字,如下所示:

如果我有这8个17位整数:

[25409, 23885, 24721, 23159, 25409, 23885, 24721, 23159]
Run Code Online (Sandbox Code Playgroud)

我会把它们变成基数2表示法

["00110001101000001", "00101110101001101", "00110000010010001", "00101101001110111", "00110001101000001", "00101110101001101", "00110000010010001", "00101101001110111"]
Run Code Online (Sandbox Code Playgroud)

然后将其加入一个大字符串:

"0011000110100000100101110101001101001100000100100010010110100111011100110001101000001001011101010011010011000001001000100101101001110111"
Run Code Online (Sandbox Code Playgroud)

然后将其分成17个字符串,每个字符串有8个字符:

["00110001", "10100000", "10010111", "01010011", "01001100", "00010010", "00100101", "10100111", "01110011", "00011010", "00001001", "01110101", "00110100", "11000001", "00100010", "01011010", "01110111"]
Run Code Online (Sandbox Code Playgroud)

最后,将二进制表示转换回整数

[49, 160, 151, 83, 76, 18, 37, 167, 115, 26, 9, 117, 52, 193, 34, 90, 119]
Run Code Online (Sandbox Code Playgroud)

这种方法有效,但效率不高,我正在寻找比这更有效的东西,最好用C++编写,因为那是我正在使用的语言.我只是想不出任何方法来提高效率,并且17位数字并不是很容易使用(16位数字可以更好地使用).

在此先感谢,xfbs

NPE*_*NPE 10

按原样存储每个数字的最低16位(即以两个字节为单位).这留下了每个数字的最重要位.由于有八个这样的数字,只需将八位组合成一个额外的字节.

这将需要与您的方法完全相同的内存量,但将涉及更少的位错.

PS不管存储方法,你应该使用位处理运算符(<<,>>,&,|等)来完成这项工作; 不应该涉及任何基于字符串的中间表示.


Nim*_*Nim 5

看一下std::bitset<N>。也许你可以把它们塞进去?