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 に答える