好吧,我有以下问题:我有一组8个(无符号的)数字,它们都是17位(也就是。它们都不会大于131071)。由于17位数字是令人讨厌的工作(将它们保存在32位整数中是浪费空间),我想将它们转换为17个8位数字,如下所示:
如果我有这8个17位整数:
[25409, 23885, 24721, 23159, 25409, 23885, 24721, 23159]我会把它们变成基数2的representationL
["00110001101000001", "00101110101001101", "00110000010010001", "00101101001110111", "00110001101000001", "00101110101001101", "00110000010010001", "00101101001110111"]然后将其连接到一个大字符串中:
"0011000110100000100101110101001101001100000100100010010110100111011100110001101000001001011101010011010011000001001000100101101001110111"然后将其拆分为17个字符串,每个字符串包含8个字符:
["00110001", "10100000", "10010111", "01010011", "01001100", "00010010", "00100101", "10100111", "01110011", "00011010", "00001001", "01110101", "00110100", "11000001", "00100010", "01011010", "01110111"]最后,将二进制表示形式转换回整数
[49, 160, 151, 83, 76, 18, 37, 167, 115, 26, 9, 117, 52, 193, 34, 90, 119]这种方法有效,但效率不是很高,我正在寻找比这更有效的方法,最好用C++编写,因为这是我正在使用的语言。我只是想不出任何更有效的方法来做这件事,而且17位数字并不是很容易处理(16位数字会更好处理)。
提前谢谢你,xfbs
发布于 2011-07-26 01:07:34
按原样存储每个数字的最低16位(即两个字节)。这就留下了每个数字的最高有效位。因为有八个这样的数字,所以只需将这八个位组合成一个额外的字节。
这将需要与您的方法完全相同的内存量,但涉及的比特闲置要少得多。
附注:无论采用哪种存储方法,您都应该使用位操作运算符(<<、>>、&、|等)来完成这项工作;不应该涉及任何基于字符串的中间表示法。
发布于 2011-07-26 01:08:33
看看std::bitset<N>吧。也许你可以把它们塞进去?
发布于 2011-07-26 01:24:46
高效?然后不要使用字符串转换,位域等。设法自己做移位来实现这一点。(请注意,数组必须是unsigned,这样我们在移位时就不会遇到问题)。
uint32 A[8]; //Your input, unsigned int
ubyte B[17]; //Output, unsigned byte
B[0] = (ubyte)A[0];
B[1] = (ubyte)(A[0] >> 8);
B[2] = (ubyte)A[1];
B[3] = (ubyte)(A[1] >> 8);
.
:对于最后一个,我们按照ajx说的做。我们取每个数字的最高有效位(将它们向右移动16位,留下第17位),并通过将每个最高有效位从0到7向左移动来填充输出的位:
B[16] = (A[0] >> 16) | ((A[1] >> 16) << 1) | ((A[2] >> 16) << 2) | ((A[3] >> 16) << 3) | ... | ((A[7] >> 16) << 7);嗯,“高效”就是这样的。还有其他更简单的方法。
https://stackoverflow.com/questions/6819769
复制相似问题