C语言每日一题——第十三天

第十三天

小明看了看嵌入式相关代码,发现了他的一个盲点……他需要学会“拆分”和“组装”一个“大空间”变量。

程序定义了两个函数,一个用于将32位无符号整数“拆分”为三个无符号8位整数,一个用于将三个无符号8位整数“组装”回32位无符号整数。在主函数内,使用者将输入一个32位无符号整数,程序将这个数转存到无符号8位整数数组中,并在打印数组后,调用“组装”函数将数组组装回32位无符号整数。

“拆分”示意图:

32位无符号整数:
- 十进制:258
- 二进制:0000 0000 0000 0001 0000 0010

被拆分为三个8位无符号整数:
- 第一个8位无符号整数:
  - 二进制:0000 0000
  - 十进制:0
- 第二个8位无符号整数:
  - 二进制:0000 0001
  - 十进制:1
- 第三个8位无符号整数:
  - 二进制:0000 0010
  - 十进制:2

8位无符号整数数组打印样式:
000,001,002

额外要求

实现以下两个函数:

/**
 * @brief      : 将 value 拆分为 3 段,写入 disk 中
 * @param value: 待写入值
 * @param disk : 被写入的位置
 */
void serialization(uint32_t value, uint8_t *disk);

/**
 * @brief     : 将 data[0] ~ data[2] 组合为一个int变量
 * @param data: 数据保存位置
 * @return    : 组合得到的值
 */
uint32_t deserialize(const uint8_t *data);

输入

程序运行时,通过scanf获取一个不大于0xffffffff的正整数。

输出

被转存的数组,以及由数组转换回的正整数。

示例

Input value number:257
 Got `257` divided to 000,001,001.
Combine: 257.
Input value number:7
 Got `7` divided to 000,000,007.
Combine: 7.

关键

位移的应用,指针传入函数


解析

#include <stdio.h>
#include <stdint.h>


void serialization(uint32_t value, uint8_t *disk);

uint32_t deserialize(const uint8_t *data);


int main() {
    uint32_t value;
    uint8_t data[3];
    printf("Input value number: ");
    scanf("%u", &value);

    serialization(value, data);

    printf("Got `%u` divided to %03hu,%03hu,%03hu.\n", value, data[0], data[1], data[2]);

    printf("Combine: %u.\n", deserialize(data));

    return 0;
}


/**
 * @brief      : 将 value 拆分为 3 段,写入 disk 中
 * @param value: 待写入值
 * @param disk : 被写入的位置
 */
void serialization(uint32_t value, uint8_t *disk) {
    for (int i = 2; i >= 0; i--) {
        disk[i] = value;
        value >>= 8;
    }
}

/**
 * @brief     : 将 data[0] ~ data[2] 组合为一个int变量
 * @param data: 数据保存位置
 * @return    : 组合得到的值
 */
uint32_t deserialize(const uint8_t *data) {
    uint32_t ret = 0;
    for (int i = 0; i < 2; i++) {
        ret += data[i];
        ret <<= 8;
    }
    ret += data[2];
    return ret;
}
posted @ 2022-10-10 10:43  风吹云动  阅读(138)  评论(0编辑  收藏  举报