我应该将一些短片打包成32位整数。它是一项家庭作业,将带来更大的压缩/解压缩思路。
我没有理解如何将短片打包成整数,但我很难理解如何将每个短值存储在整数中。
因此,例如,我将值2,4,6,8存储到整数中。这意味着我想按照我输入的顺序打印它们。
如何从整数中获取这些值?
编辑:此上下文中的短语是指无符号的双字节整数。
答案 0 :(得分:0)
正如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位变量)修复的答案: 假设第一个char是MSB上的开头,最后一个是结束于LSB的那个:
2|4|6|8
00000001|00000010|000000110|00001000
000000010000001000000011000001000
33818120
因此,在这个例子中,第一个char是2(0010),然后是4(0100),6(0110)和last: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;
答案 1 :(得分:0)
这对char来说会更有趣[因为你得到4]。但是,您只能将两个短片打包到一个int中。所以,对于教练的想法,我有点神秘。
考虑一个联盟:
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];
}
现在考虑使用shift进行编码/解码:
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;
}