按位运算,位丢失,适合8位容器

时间:2017-07-09 02:50:39

标签: operators bit-manipulation shift

我试图将16位,32位和64位值放入8位容器中

我能够将位移到容器只有8位数据的位置,但我不知道如何将它们带回以反映该值。我整天都在绞尽脑汁,我无法理解。任何帮助都会如此惊人。这是我在开始实验项目之前尝试过的代码,因为这让我感到困惑。如何存储8位然后返回并能够在没有丢失位的情况下将其拉回来

    #include <iostream>
    #include <stdio.h>
    #include <cstdint>

    using namespace std;

    int main()
    {

        const int MAX_SIZE = 1000;
        uint16_t data = 62153;
        uint8_t mem[MAX_SIZE];

        cout << data << endl;

        data = ( data >> 8) & 0xff;
        cout << data << endl;
        data = ( data << 8);
        cout << data << endl;
        return 0;
    }

输出是:

  

1111 0010 1100 1001 = 62153

     

1111 0010 =位移后的242

     

1111 0010 0000 0000 = 61952转回

那些比特消失了,我怎么能通过分解比特来节省空间以便能够将它们存储在一个较小的容器中,同时仍然可以让一个函数返回并读取转换前的全部值。这是家庭作业,所以我不是要求答案。推动正确的方向将非常感激。

1 个答案:

答案 0 :(得分:0)

这应该可以推动 A 方向。您也可以使用堆栈来实现类似的功能。通过使用矢量,您可以通过检查矢量的大小来确定输出。例如,如果您知道vector::size() == 2需要创建新的uint16_t。如果矢量大小为4,则需要uint32_t等...

#include <vector>
#include <cstdint>
#include <iostream>

int main()
{
    std::vector<uint8_t> bytes;

    uint16_t data = 62153;
    uint8_t lsb = data & 0xff;
    uint8_t msb = (data >> 8) & 0xff;

    bytes.push_back(lsb);
    bytes.push_back(msb);

    uint16_t new_data = 0;
    new_data = new_data | (bytes.at(1) << 8);
    new_data = new_data | bytes.at(0);

    std::cout << new_data << std::endl;
    return 0;
}