【发布时间】:2020-12-04 00:53:35
【问题描述】:
我有四个整数,我需要将它们转换成一个无符号的 32 位整数。我正在将 HDR 图像转换为 LDR 输出图像数据。
【问题讨论】:
标签: c++ unsigned unsigned-integer
我有四个整数,我需要将它们转换成一个无符号的 32 位整数。我正在将 HDR 图像转换为 LDR 输出图像数据。
【问题讨论】:
标签: c++ unsigned unsigned-integer
您有四个 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 在我所知道的任何平台上都不是 8 位。在旧平台上,它可能是 16 位,但大多数现代平台使用 32 位 int。但是,是的,即使使用ints,这个解决方案也可以使用。我已经更新了我的答案。