我应该把一些短裤装成32位整数。这是一项家庭作业,它将带来一个更大的压缩/解压缩的想法。
我在理解如何将短裤打包成整数时没有任何问题,但我很难理解如何将每个短值存储在整数中。
例如,我将值2、4、6、8存储在整数中。这意味着我想按照输入的顺序打印它们。
如何从整数中提取这些值?
编辑:短裤在这个上下文中指的是一个无符号的双字节整数.
发布于 2015-10-11 21:04:15
由于Craig纠正了我,short是一个16位变量,因此只有2条短裤可以容纳一个int,所以我的答案是检索短裤:
2|4
000000000000001|00000000000000100
00000000000000100000000000000100
131076首先表示为最左变量,最后表示为最右变量,得到短变量如下所示:
int x = 131076; //00000000000000100000000000000100 in binary
short last = x & 65535; // 65535= 1111111111111111
short first= (x >> 16) & 65535;下面是我先前对压缩字符(8位变量)的回答:让我们假设第一个字符是MSB的开始,最后一个是以LSB结尾的:
2|4|6|8
00000001|00000010|000000110|00001000
000000010000001000000011000001000
33818120因此,在这个例子中,第一个字符是2 (0010),后面是4 (0100),6 (0110)和最后一个:8 (1000)。
因此,要获得压缩的数字,可以使用以下代码:
int x = 33818120; //00000010000001000000011000001000 in binary
char last = x & 255; // 255= 11111111
char third = (x >> 8) & 255;
char second = (x >> 16) & 255;
char last = (x >> 24) & 255;发布于 2015-10-11 22:53:15
这将是更有趣的char,因为你会得到4。但是,你只能把两条短裤打包成一个整数。所以,我对这位老师的想法有点困惑。
考虑成立工会:
union combo {
int u_int;
short u_short[2];
char u_char[4];
};
int
getint1(short s1,short s2)
{
union combo combo;
combo.u_short[0] = s1;
combo.u_short[1] = s2;
return combo.u_int;
}
short
getshort1(int val,int which)
{
union combo combo;
combo.u_int = val;
return combo.u_short[which];
}现在考虑使用移位编码/解码:
unsigned int
getint2(unsigned short s1,unsigned short s2)
{
unsigned int val;
val = s1;
val <<= 16;
val |= s2;
return val;
}
unsigned short
getshort2(unsigned int val,int which)
{
val >>= (which * 16);
return val & 0xFFFF;
}上面没有签名的代码可能会做您想做的事情。
但是,下一个使用的是有符号的值,并且可能不起作用,因为s1/s2和编码/解码之间可能存在混合符号,这可能会带来问题。
int
getint3(short s1,short s2)
{
int val;
val = s1;
val <<= 16;
val |= s2;
return val;
}
short
getshort3(int val,int which)
{
val >>= (which * 16);
return val & 0xFFFF;
}https://stackoverflow.com/questions/33069918
复制相似问题