我在C中有以下代码:
#include <stdint.h>
uint32_t result;
uint8_t bit[4] = {1, 2, 3, 4};
由于bit
数组的每个元素占用8位,而变量result
占用32位,我想使用result
数组中的4个元素形成bit
, bit[0]
取最高有效位(MSB)为result
的8位,bit[1]
取result
的第二个MSB 8位,bit[2]
取第三个MSB 8 result
,bit[3]
的位取result
的最低有效位8位,如何在C中形成它?
我知道位移操作符,但在移位所有元素之后,如何将它们组合在一起形成一个值?
答案 0 :(得分:3)
经典方法是相应地移位值并按位移动它们:
result = bit[3] | (bit[2] << 8) | (bit[1] << 16) | (bit[0] << 24);
当您对小于int
的类型执行轮班操作时,它会自动“提升”为int
(查找“整数提升”)。由于int
在所有实际系统中至少为32位,因此该代码在实际意义上是安全的。
但是,如果您需要使用大于int的数据类型,则应在转换之前将bit[x]
强制转换为目标类型。例如,如果您正在使用int为16位的平台(例如8086),那么正确的代码将是:
result = (uint32_t)bit[3] | ((uint32_t)bit[2] << 8) | ((uint32_t)bit[1] << 16) | ((uint32_t)bit[0] << 24);
(这有一些不必要的演员,但说明了一点,并没有伤害任何东西)
同样,如果result
为uint64_t
并且您在bit
中有8个元素,则需要将它们全部投放到uin64_t
,因为默认情况下它们只会升级到int
,这可能是32位。
但是,如果要访问uint32_t
的特定字节,可以将它们声明为联合:
union { uint32_t result; uint8_t bytes[4]; } u;
u.result = 0xabcdef12;
u.bytes[2] = 0x78;
printf("%x", u.result);