从整数中获取短裤

Getting shorts from an integer

我应该将一些短裤打包成一个 32 位整数。这是一项家庭作业,将导致 compression/decompression 的更大想法。

我在理解如何将 shorts 打包成一个整数方面没有任何问题,但我很难理解如何将每个 short 值存储在整数中。

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

你如何从整数中得到这些值?

编辑:本文中的 Shorts 指的是一个无符号的两字节整数。

正如 Craig 纠正我的那样,short 是一个 16 位变量,因此只有 2 个 shorts 可以放在一个 int 中,所以这是我检索 shorts 的答案:

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;

使用 char 会更有趣 [因为你会得到 4]。但是,您只能将 two shorts 打包成一个 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];
}

现在考虑 encoding/decoding 轮班:

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 和 encoding/decoding 之间使用混合符号,这可能会出现问题

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