好吧,我有以下问题:我有一组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 02:32:11
我可能会这样做。我不想在处理过程中遇到奇怪的类型。也许,由于遗留问题,我需要以一些时髦的格式来存储它们。硬编码的值可能应该基于17的值,只是没有麻烦。
struct int_block {
static const uint32 w = 17;
static const uint32 m = 131071;
int_block() : data(151, 0) {} // w * 8 + (sizeof(uint32) - w)
uint32 get(size_t i) const {
uint32 retval = *reinterpret_cast<const uint32 *>( &data[i*w] );
retval &= m;
return retval;
}
void set(size_t i, uint32 val) {
uint32 prev = *reinterpret_cast<const uint32 *>( &data[i*w] );
prev &= ~m;
val |= prev;
*reinterpret_cast<uint32 *>( &data[i*w] ) = val;
}
std::vector<char> data;
};
TEST(int_block_test) {
int_block ib;
for (uint32 i = 0; i < 8; i++)
ib.set(i, i+25);
for (uint32 i = 0; i < 8; i++)
CHECK_EQUAL(i+25, ib.get(i));
}您可以通过赋予它错误的值来打破这一点,但我将把它留给读者作为练习。:)
老实说,我认为将它们表示为32位整数并只编写转换函数会更好。但我怀疑你无法控制这一点。
https://stackoverflow.com/questions/6819769
复制相似问题