MST

星途 面试题库

面试题:C语言结构体与位操作实现数据压缩

假设你有一系列传感器数据,其中部分数据可以用少量的位来表示。使用C语言结构体和位操作,设计一个数据结构来存储这些传感器数据,并实现数据的压缩存储和解压缩读取。说明设计思路并编写相应代码。
14.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 结构体定义:利用C语言结构体的位域特性,将可以用少量位表示的数据定义为位域,以实现压缩存储。例如,如果某个传感器数据范围在0 - 7之间,就可以用3位来表示。
  2. 数据压缩存储:通过对结构体成员赋值,将数据存储到位域中。
  3. 数据解压缩读取:直接访问结构体成员获取数据,编译器会处理位域到实际数据值的转换。

代码实现

#include <stdio.h>

// 定义存储传感器数据的结构体
typedef struct {
    unsigned int sensor1 : 3;  // 假设sensor1数据范围在0 - 7之间,用3位存储
    unsigned int sensor2 : 4;  // 假设sensor2数据范围在0 - 15之间,用4位存储
    unsigned int sensor3 : 5;  // 假设sensor3数据范围在0 - 31之间,用5位存储
} SensorData;

// 函数:压缩存储数据
void compressData(SensorData *data, unsigned int value1, unsigned int value2, unsigned int value3) {
    data->sensor1 = value1 & 0x7;  // 确保value1在0 - 7之间
    data->sensor2 = value2 & 0xF;  // 确保value2在0 - 15之间
    data->sensor3 = value3 & 0x1F; // 确保value3在0 - 31之间
}

// 函数:解压缩读取数据
void decompressData(SensorData *data, unsigned int *value1, unsigned int *value2, unsigned int *value3) {
    *value1 = data->sensor1;
    *value2 = data->sensor2;
    *value3 = data->sensor3;
}

int main() {
    SensorData data;
    unsigned int value1 = 5, value2 = 10, value3 = 20;

    compressData(&data, value1, value2, value3);

    unsigned int readValue1, readValue2, readValue3;
    decompressData(&data, &readValue1, &readValue2, &readValue3);

    printf("Read sensor1: %u\n", readValue1);
    printf("Read sensor2: %u\n", readValue2);
    printf("Read sensor3: %u\n", readValue3);

    return 0;
}