首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从整数中获取空头

从整数中获取空头
EN

Stack Overflow用户
提问于 2015-10-11 20:41:13
回答 2查看 282关注 0票数 0

我应该把一些短裤装成32位整数。这是一项家庭作业,它将带来一个更大的压缩/解压缩的想法。

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

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

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

编辑:短裤在这个上下文中指的是一个无符号的双字节整数.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-11 21:04:15

由于Craig纠正了我,short是一个16位变量,因此只有2条短裤可以容纳一个int,所以我的答案是检索短裤:

代码语言:javascript
复制
2|4
000000000000001|00000000000000100
00000000000000100000000000000100
131076

首先表示为最左变量,最后表示为最右变量,得到短变量如下所示:

代码语言:javascript
复制
int x = 131076; //00000000000000100000000000000100 in binary
short last = x  & 65535; // 65535= 1111111111111111
short first= (x >> 16) & 65535;

下面是我先前对压缩字符(8位变量)的回答:让我们假设第一个字符是MSB的开始,最后一个是以LSB结尾的:

代码语言:javascript
复制
2|4|6|8
00000001|00000010|000000110|00001000
000000010000001000000011000001000
33818120

因此,在这个例子中,第一个字符是2 (0010),后面是4 (0100),6 (0110)和最后一个:8 (1000)。

因此,要获得压缩的数字,可以使用以下代码:

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2015-10-11 22:53:15

这将是更有趣的char,因为你会得到4。但是,你只能把两条短裤打包成一个整数。所以,我对这位老师的想法有点困惑。

考虑成立工会:

代码语言:javascript
复制
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];
}

现在考虑使用移位编码/解码:

代码语言:javascript
复制
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和编码/解码之间可能存在混合符号,这可能会带来问题。

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33069918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档