用于解码无符号短值的函数

时间:2013-11-14 10:52:08

标签: c++ c data-structures decode short

我的任务很小。

我们对此主题进行了调查。单个调查的结果(从一个受访者获得)提供了以下信息,这些信息将被编码为无符号短类型的变量(可以假设它是2个字节--16位)

  1. 性别 - 1位 - 2种可能性
  2. 婚姻状况 - 2位 - 4种可能性
  3. 年龄 - 2位 - 4种可能性
  4. 教育 - 2位 - 4种可能性
  5. 城市 - 2位 - 4种可能性
  6. 区域 - 4位 - 16种可能性
  7. 回答 - 3位 - 8种可能性

     unsigned short coding(int sex, int marital_status, int age, int edu, int city, int region, int reply){
    
        unsigned short result = 0;
    
        result = result + sex;
        result = result + ( marital_status << 1 );
        result = result + ( age << 3);
        result = result + ( edu << 5 );
        result = result + ( city << 6 );
        result = result + ( region << 11 );
        result = result + ( reply << 13 );
    
        return result;
    }
    
  8. 这里它编码结果(希望它是正确的),但我不知道如何准备将显示信息的函数,我在无符号短x中编码。

    首先我必须编码:

         unsigned short x = coding(0, 3, 2, 3, 0, 12, 6);
    

    然后我需要准备另一个函数,它会将 unsigned short x 中的信息解码为这种形式:

        info(x);
    
    
        RESULT
        sex:                 0
        martial status:      3
        age:                 2
        education:           3
        city:                0
        region:              12
        reply:               6
    

    我将非常感谢你的帮助,因为我不知道如何开始以及如何寻找。

    我的问题是,是否有人可以检查无符号短编码功能并帮助编写无效信息(unsigned short x)。

2 个答案:

答案 0 :(得分:5)

您可以使用位字段

struct survey_data
{
    unsigned short sex            : 1;
    unsigned short marital_status : 2;
    unsigned short age            : 2;
    unsigned short education      : 2;
    unsigned short city           : 2;
    unsigned short region         : 4;
    unsigned short answer         : 3;
};

如果你需要在short之间进行转换,你可以定义一个这样的联合

union survey
{
    struct survey_data detail;
    unsigned short s;
};

使用这些类型

struct survey_data sd;
sd.sex = 0;
sd.marital_status = 2;
...
unsigned short s = 0xCAFE;
union servey x;
x.s = s;
printf("Sex: %u, Age: %u", x.detail.sex, x.detail.age);

请记住位字段的布局是实现定义的;不同的编译器可以按不同顺序解释它们,例如在MSVC中,它是lsb到msb; pelase有关详细信息,请参阅编译器手册和c / c ++标准。

答案 1 :(得分:1)

解决方案很简单,而且主要是文本工作。转移您的数据描述

sex - 1 bit - 2 possibilities
marital status - 2 bits - 4 possibilities
Age - 2 bits - 4 possibilities
Education - 2 bits - 4 possibilities
City - 2 bits - 4 possibilities
region - 4 bits - 16 possibilities
answer - 3 bits - 8 possibilities

进入这个C / C ++结构:

struct Data {
    unsigned sex:        1; //  2 possibilities
    unsigned marital:    2; //  4 possibilities
    unsigned Age:        2; //  4 possibilities
    unsigned Education:  2; //  4 possibilities
    unsigned City:       2; //  4 possibilities
    unsigned region:     4; // 16 possibilities
    unsigned answer:     3; //  8 possibilities
};

这是bit sets 的标准用例,它甚至是传统的C,但也可以在每个符合标准的C ++实现中使用。

让我们将您的16位编码数据类型命名为存储store_t(来自several definitions in use我们使用C标准标题stdint.h):

#include <stdint.h>
typedef uint16_t store_t;

示例Data结构可用于编码

/// create a compact storage type value from data
store_t encodeData(const Data& data) {
    return *reinterpret_cast<const store_t*>(&data);
}

解码您的数据集:

/// retrieve data from a compact storage type
const Data decodeData(const store_t code) {
    return *reinterpret_cast<const Data*>(&code);
}

您像普通结构一样访问位集结构Data

Data data;
data.sex = 1;
data.marital = 0;