2014-01-10 112 views
3

我想扭轉十六進制數字的字節,如:如何反轉十六進制數字的字節?

0x08090a0b應該轉換爲0x0b0a0908

我已經使用了這個宏。

#define REV(X)  ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24)) 
+1

那麼你是否達到你想要的? – const

+1

這個問題與翻轉整數有什麼不同嗎? –

+1

這是什麼問題?只有當sizeof(X)> 4'或X被簽名時,我才能看到這種方法的問題。 –

回答

0

check this

int main(void) 
    { 
    // your code goes here 
    unsigned int X = 0x08090a0b; 

    printf("%8x", ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24))); 
    return 0; 
    } 

你只輸出是正確的。你是說0最初沒有被顯示?

09 = 9 你的情況x0b0a0908 = b0a0908

1

它是更清潔和更容易理解,如果你結合了掩蔽移位:下面我同時顯示完整的表達,及其組件分開。請注意,你不需要掩碼中的前導零 - 我把它放在那裏以便清晰/對齊。因爲所有「不需要的」位都從表達式中移出,所以你不需要第一個和最後一個詞的掩碼。同時

#define REV(X) ((X << 24) | ((X & 0xff00) << 8) | ((X >> 8) & 0xff00) | (X >> 24)) 

一個字節:

#define R1(X) ((X & 0x000000ff) << 24) 
#define R2(X) ((X & 0x0000ff00) << 8) 
#define R3(X) ((X & 0x00ff0000) >> 8) 
#define R4(X) ((X & 0xff000000) >> 24) 

要正確打印數量,使用

printf("%08x", REV(x)); 

這將確保前導零打印。您必須確保您的輸入是32位無符號整數,才能正常工作。

+0

謝謝。我知道了。 –

+0

很簡單的解釋。帽子掉了! – Gomu

相關問題