【发布时间】:2011-10-12 18:47:10
【问题描述】:
好的,我有以下问题:我有一组 8 个(无符号)数字,它们都是 17 位的(也就是没有一个大于 131071)。由于 17 位数字很烦人(将它们保存在 32 位 int 中会浪费空间),我想将它们转换为 17 个 8 位数字,如下所示:
如果我有这 8 个 17 位整数:
[25409, 23885, 24721, 23159, 25409, 23885, 24721, 23159]
我会把它们变成一个基数为 2 的表示L
["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
【问题讨论】:
-
您在哪个平台上工作,担心将这些存储在 32 位整数中会浪费空间?
-
@Praetorian:大概是任何可用内存少于两倍数据大小的平台。
-
@Steve Jessop 好吧,它并不完全是两倍,只是多出了 88% 的空间 :-) 但是说真的,如果程序的其他部分期望这些数字是 17 位整数,而不是字节数组彼此相邻,OP 会将这些字节重新转换为 17 位表示。他是否使用所有格式的按摩代码来节省内存是有争议的。
-
您担心效率的标准是什么?速度?记忆?关于磁盘序列化?我也对平台问题很好奇,这似乎是你想多了,如果它没有什么特别的。
-
其实我并不太担心浪费空间,另一个原因是我可以轻松导出 8bit 整数:它们恰好有合适的大小将它们转换为字符,然后我可以将整个内容导出为字符串。