位运算,位脱落,适合8位容器

Bitwise operations, bits falling off, fit into 8 bit container

我正在尝试将 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 after bit shift

1111 0010 0000 0000 = 61952 shift back

那些位已经消失了,我如何通过分解这些位来保存 space 以便能够将它们存储在一个较小的容器中,同时仍然能够让一个函数返回并读取完整的内容价值是在转变之前。这是家庭作业,所以我不要求答案。向正确的方向推动将不胜感激。

这应该会给你一个 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;
}