3

这是问题所在,我目前有什么,我只是不明白它是怎么错的......

getByte - 从字 x 中提取字节 n 字节编号从 0 (LSB) 到 3 (MSB) 示例:getByte(0x12345678,1) = 0x56 合法操作:!~ & ^ | + << >> 最大操作数:6 评分:2

int getByte(int x, int n) {
  return ((x << (24 - 8 * n)) >> (8 * n));
}
4

3 回答 3

14

你的移位没有任何意义——首先,你左移 (24 - 8n) 位,然后你右移 8n 位。为什么?而且,这是错误的。如果 n 为 0,则将 x 左移 24 位并返回该值。试试笔和纸,看看这是完全错误的。

正确的做法是:

int getByte(int x, int n) {
  return (x >> 8*n) & 0xFF;
}
于 2012-04-12T22:28:28.183 回答
7

除非我完全弄错了,否则您的代码在数学上是不正确的。

getByte(0x000000ff, 0) {
    24 - 8 * n = 24;
    8 * n = 0;
    0x000000ff << 24 = 0xff000000;
    0xff000000 >> 0 = 0xff000000;
    return 0xff000000; // should return 0xff
}

不允许使用运算符-,尤其*是一个问题(不能做* 8)。我想出了这个:

uint8_t getByte (uint32_t x, int n) {
    switch (n) {
        case 0:
            return x & 0xff;
        case 1:
            return (x >> 8) & 0xff;
        case 2:
            return (x >> 16) & 0xff;
        case 3:
            return x >> 24;
    }
}

不是很漂亮,但符合问题描述:6 个操作符,都是合法的。

编辑:刚刚有一个(非常明显的)想法来避免* 8

uint8_t getByte (uint32_t x, int n) {
    return (x >> (n << 3)) & 0xff;
}
于 2012-04-12T22:52:46.863 回答
1

我不明白你的功能是如何工作的。试试这个:

int getByte(int x, int n)
{
     return (x >> (8 * n)) & 0xFF;
}
于 2012-04-12T22:28:16.527 回答