首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何有效地将8个17位整数转换为17个8位整数

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

Stack Overflow用户
提问于 2011-07-26 01:05:15
回答 6查看 660关注 0票数 3

好吧,我有以下问题:我有一组8个(无符号的)数字,它们都是17位(也就是。它们都不会大于131071)。由于17位数字是令人讨厌的工作(将它们保存在32位整数中是浪费空间),我想将它们转换为17个8位数字,如下所示:

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

代码语言:javascript
复制
[25409, 23885, 24721, 23159, 25409, 23885, 24721, 23159]

我会把它们变成基数2的representationL

代码语言:javascript
复制
["00110001101000001", "00101110101001101", "00110000010010001", "00101101001110111", "00110001101000001", "00101110101001101", "00110000010010001", "00101101001110111"]

然后将其连接到一个大字符串中:

代码语言:javascript
复制
"0011000110100000100101110101001101001100000100100010010110100111011100110001101000001001011101010011010011000001001000100101101001110111"

然后将其拆分为17个字符串,每个字符串包含8个字符:

代码语言:javascript
复制
["00110001", "10100000", "10010111", "01010011", "01001100", "00010010", "00100101", "10100111", "01110011", "00011010", "00001001", "01110101", "00110100", "11000001", "00100010", "01011010", "01110111"]

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

代码语言:javascript
复制
[49, 160, 151, 83, 76, 18, 37, 167, 115, 26, 9, 117, 52, 193, 34, 90, 119]

这种方法有效,但效率不是很高,我正在寻找比这更有效的方法,最好用C++编写,因为这是我正在使用的语言。我只是想不出任何更有效的方法来做这件事,而且17位数字并不是很容易处理(16位数字会更好处理)。

提前谢谢你,xfbs

EN

回答 6

Stack Overflow用户

发布于 2011-07-26 01:07:34

按原样存储每个数字的最低16位(即两个字节)。这就留下了每个数字的最高有效位。因为有八个这样的数字,所以只需将这八个位组合成一个额外的字节。

这将需要与您的方法完全相同的内存量,但涉及的比特闲置要少得多。

附注:无论采用哪种存储方法,您都应该使用位操作运算符(<<>>&|等)来完成这项工作;不应该涉及任何基于字符串的中间表示法。

票数 10
EN

Stack Overflow用户

发布于 2011-07-26 01:08:33

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

票数 4
EN

Stack Overflow用户

发布于 2011-07-26 01:24:46

高效?然后不要使用字符串转换,位域等。设法自己做移位来实现这一点。(请注意,数组必须是unsigned,这样我们在移位时就不会遇到问题)。

代码语言:javascript
复制
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向左移动来填充输出的位:

代码语言:javascript
复制
B[16] = (A[0] >> 16)  | ((A[1] >> 16) << 1) | ((A[2] >> 16) << 2) | ((A[3] >> 16) << 3) | ... | ((A[7] >> 16) << 7);

嗯,“高效”就是这样的。还有其他更简单的方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6819769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档