我的任务很小。
我们对此主题进行了调查。单个调查的结果(从一个受访者获得)提供了以下信息,这些信息将被编码为无符号短类型的变量(可以假设它是2个字节--16位)
回答 - 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;
}
这里它编码结果(希望它是正确的),但我不知道如何准备将显示信息的函数,我在无符号短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)。
答案 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;