📜  十六进制数的反向字节

📅  最后修改于: 2021-04-24 19:47:11             🧑  作者: Mango

给定一个无符号整数N。任务是在不使用临时变量的情况下反转N的所有字节,并打印反转的数字。

例子:

天真的方法是提取适当的字节,即使用带移位运算符的mask(&)。

高效的方法:
这个想法是只使用移位运算符。

  • 使用左移运算符(<<)将最后一个字节的位置移到第一个字节。
  • 使用右移运算符(>>)将第一个字节的位置移至最后一个字节。
  • 使用左移和右移运算符组合移动中间字节。
  • 将逻辑OR(|)应用于上述所有表达式的输出,以获取所需的输出。

下面是上述方法的实现:

// C program to reverse bytes of a hexadecimal number
#include 
// macro which reverse the hexadecimal integer
#define REV(n) ((n << 24) | (((n>>16)<<24)>>16) | \
                    (((n<<16)>>24)<<16) | (n>>24))
  
// Driver code
int main()
{
    unsigned int n = 0xa912cbd4;
      
    //  n = 0xaabbccdd
    // (n >> 24) - 0x000000aa
    // (n << 24) - 0xdd000000
    // (((n >> 16) << 24) >> 16) - 0xbb00
    // (((n >> 8) << 24) >> 8) - 0xcc0000
    // If output of all the above expression is 
    // OR'ed then it results in 0xddccbbaa
      
    printf("%x is reversed to %x", n, REV(n));
      
    return 0;
}
输出:
a912cbd4 is reversed to d4cb12a9