在C中以位为单位拆分uint16_t

时间:2015-05-11 00:34:57

标签: c type-conversion

你好我有一个uint16_t号,我需要将它分成3个部分。

这个数字的前5位给了我一小时。

这个数字的下一个6位给我分钟。

这个数字的下5位给我秒数。

所以我需要将它分成3部分来获取我需要的信息。

任何想法?

2 个答案:

答案 0 :(得分:5)

暂且不说,你不能将8位分成16位(我假设你实际上有一个uint16_t,因为这里有意义),你想要的是一个掩码。我们假设您的16位值存储在变量"值"

要获得第一个(最重要的)5位,您可以使用掩码0xF800,二进制为1111100000000000。

您使用按位AND来应用此:

    const uint16_t MASK;
    uint16_t value = whatever_was_passed_in;
    value = value & MASK;

这会将您不感兴趣的位清零。如果您希望这些位向下移动到变量的最低位,您可以通过右移来实现:

    value = (value & MASK) >> 11;

其他组块使用相同的过程处理,但掩码和移位值不同。

答案 1 :(得分:1)

typedef struct bit_time {
   unsigned int hour:5;
   unsigned int minute:6;
   unsigned int seconds:5;
} bit_time_t;

Here's a good explanation.