首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

Stack Overflow用户

发布于 2011-07-26 02:32:11

我可能会这样做。我不想在处理过程中遇到奇怪的类型。也许,由于遗留问题,我需要以一些时髦的格式来存储它们。硬编码的值可能应该基于17的值,只是没有麻烦。

代码语言:javascript
复制
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位整数并只编写转换函数会更好。但我怀疑你无法控制这一点。

票数 0
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6819769

复制
相关文章

相似问题

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