4个带符号的字节打包成32位无符号

时间:2011-09-06 06:32:34

标签: c++ bit-manipulation

// Declaration of data type where 4 bytes are packed into an unsigned.   
int xbyte(packed_t word, int bytenum);

int main()
{
    int bytenum = 0;
    typedef unsigned packed_t;
    packed_t word;
}

// Extract byte from word, return as signed integer.
int xbyte(packed_t word, int bytenum)
{
    // Failed attempt at xbyte
    return ( word >> (bytenum << 3)) & 0xff;
}

我不确定如何在这个问题中声明packed_t。我应该从顶部使用原型。这个词怎么会发挥作用。我迷失了这是家庭作业的一部分。

3 个答案:

答案 0 :(得分:2)

您已有typedef行。将它作为这段代码的第一行,你就完成了。基本的是,typedef ed名称必须在您使用它的任何地方都可见。

答案 1 :(得分:1)

首先,当然,您可以将packed_t输入到任何整数类型中 想;在使用packed_t的任何地方都必须可以看到typedef, 但是。

其次,word >> (bytenum << 3)有点混淆。你是什​​么 希望是word >> (bytenum * 8),甚至更好:

return (word >> (bytenum * CHAR_BIT)) & ((1 << CHAR_BIT) - 1);

(很难说这里最好的解决方案是什么:上面的表达方式 即使对于字节不是8位的机器,也可以提供便携性 &右侧的子表达式非常模糊,当然也是如此 值得评论。)

最后:我们应该阅读标题中的任何内容。如果你想要 返回字节的值,好像它是一个有符号的字节,然后你就可以了 需要额外的代码来处理它。对于经典的32位二进制 补机,以下工作:

int tmp = word >> (bytenum * 8);
if ( (tmp & 0x80) != 0 )
    tmp |= 0xFFFFFF80;
else
    tmp &= 0x7F;
return tmp;

更便携(不是那种不是2的机器的便携性) 补充8位字节非常重要),你必须写:

int tmp = (word >> (bytenum * CHAR_BIT)) & ((1 << CHAR_BIT) - 1);
if ( tmp > SCHAR_MAX )
    tmp -= UCHAR_MAX + 1;
return tmp;

但这也取决于实际需要的内容。第n个的值 byte取决于硬件中整数的实际表示。该 上面的代码忽略了这一点,并将低位字节作为字节0返回,而不是 必须是第一个字节。如果你真的想要第n个字节进行某种排序 需要打字:

return *(reinterpret_cast<signed char*>( &word ) + bytenum);

如果没有更多关于所需内容的信息,很难说 应该是什么样的正确答案。

答案 2 :(得分:0)

也许工会在这里很有用

union packed_t
{
    unsigned int unsignedInt;
    char signedChar[4];
}