簡體   English   中英

使用按位運算符從32位整數檢索字節

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM