如何移位变量并形成整个值

时间:2015-11-17 12:11:29

标签: c bitwise-operators

我在C中有以下代码:

#include <stdint.h>
uint32_t result;
uint8_t bit[4] = {1, 2, 3, 4};

由于bit数组的每个元素占用8位,而变量result占用32位,我想使用result数组中的4个元素形成bitbit[0]取最高有效位(MSB)为result的8位,bit[1]result的第二个MSB 8位,bit[2]取第三个MSB 8 resultbit[3]的位取result的最低有效位8位,如何在C中形成它?

我知道位移操作符,但在移位所有元素之后,如何将它们组合在一起形成一个值?

1 个答案:

答案 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);

(这有一些不必要的演员,但说明了一点,并没有伤害任何东西)

同样,如果resultuint64_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);