从整数中获取短裤

时间:2015-10-11 20:41:14

标签: bit-manipulation

我应该将一些短片打包成32位整数。它是一项家庭作业,将带来更大的压缩/解压缩思路。

我没有理解如何将短片打包成整数,但我很难理解如何将每个短值存储在整数中。

因此,例如,我将值2,4,6,8存储到整数中。这意味着我想按照我输入的顺序打印它们。

如何从整数中获取这些值?

编辑:此上下文中的短语是指无符号的双字节整数。

2 个答案:

答案 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;
}