我想扭轉十六進制數字的字節,如:如何反轉十六進制數字的字節?
0x08090a0b
應該轉換爲0x0b0a0908
。
我已經使用了這個宏。
#define REV(X) ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24))
我想扭轉十六進制數字的字節,如:如何反轉十六進制數字的字節?
0x08090a0b
應該轉換爲0x0b0a0908
。
我已經使用了這個宏。
#define REV(X) ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24))
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
它是更清潔和更容易理解,如果你結合了掩蔽移位:下面我同時顯示完整的表達,及其組件分開。請注意,你不需要掩碼中的前導零 - 我把它放在那裏以便清晰/對齊。因爲所有「不需要的」位都從表達式中移出,所以你不需要第一個和最後一個詞的掩碼。同時
#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位無符號整數,才能正常工作。
謝謝。我知道了。 –
很簡單的解釋。帽子掉了! – Gomu
那麼你是否達到你想要的? – const
這個問題與翻轉整數有什麼不同嗎? –
這是什麼問題?只有當sizeof(X)> 4'或X被簽名時,我才能看到這種方法的問題。 –