[英]retrieve byte from 32 bit integer using bitwise operators
這是問題,我現在有什么問題,我只是不明白它是怎么回事......
getByte - 從字x中提取字節n從0(LSB)到3(MSB)編號的字節示例:getByte(0x12345678,1)= 0x56法律操作:! 〜&^ | + << >> Max ops:6評級:2
int getByte(int x, int n) {
return ((x << (24 - 8 * n)) >> (8 * n));
}
你的移位沒有任何意義 - 首先,你向左移動(24 - 8n)位,然后向右移動8n位。 為什么? 而且,這是錯的。 如果n為0,則將x向左移位24位並返回該值。 試試筆和紙,看看這是完全錯誤的。
正確的方法是:
int getByte(int x, int n) {
return (x >> 8*n) & 0xFF;
}
除非我完全弄錯,否則您的代碼在數學上是不正確的。
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;
}
我不明白你的功能是如何工作的。 試試這個:
int getByte(int x, int n)
{
return (x >> (8 * n)) & 0xFF;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.