私が完全に間違っていない限り、あなたのコードは数学的に間違っています。
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;
}