【问题标题】:c++ how to store four 8 bit integers as a 32 bit unsigned integer? [closed]c++ 如何将四个 8 位整数存储为 32 位无符号整数? [关闭]
【发布时间】:2020-12-04 00:53:35
【问题描述】:

我有四个整数,我需要将它们转换成一个无符号的 32 位整数。我正在将 HDR 图像转换为 LDR 输出图像数据。

【问题讨论】:

    标签: c++ unsigned unsigned-integer


    【解决方案1】:

    您有四个 8 位整数,您想将它们组合成一个 32 位整数。这样做的方法是使用位移,例如:

    uint8_t ui1, ui2, ui3, ui4;
    
    // set values to ui1..ui4 as neeed...
    
    uint32_t ui32 = (uint32_t(ui1) << 24) | (uint32_t(ui2) << 16) | (uint32_t(ui3) << 8) | uint32_t(ui4);
    
    // use ui32 as needed...
    

    或者,如果您需要颠倒ui32 的字节序,请更改ui1..ui4 的顺序:

    uint32_t ui32 = (uint32_t(ui4) << 24) | (uint32_t(ui3) << 16) | (uint32_t(ui2) << 8) | uint32_t(ui1);
    

    更新:鉴于您的评论:

    如果我将数字表示为正常的“int”,这会起作用吗?

    是的,这也适用于那种情况。您只需要添加一些位掩码以确保 int 值每个不超过 8 位,例如:

    int i1, i2, i3, i4;
    
    // set values to i1..i4 as neeed...
    
    uint32_t ui32 = (uint32_t(i1 & 0xFF) << 24) | (uint32_t(i2 & 0xFF) << 16) | (uint32_t(i3 & 0xFF) << 8) | uint32_t(i4 & 0xFF);
    
    // use ui32 as needed...
    

    确保int 的值在 0..255 范围内(含),以便在位掩码期间不会发生数据丢失。

    【讨论】:

    • 非常感谢。我有一个小问题。如果我将数字表示为正常的“int”,这会起作用吗?
    • @RedionSaarland int 在我所知道的任何平台上都不是 8 位。在旧平台上,它可能是 16 位,但大多数现代平台使用 32 位 int。但是,是的,即使使用ints,这个解决方案也可以使用。我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2014-10-07
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多