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;
}