给定一个无符号整数N。任务是在不使用临时变量的情况下反转N的所有字节,并打印反转的数字。
例子:
Input: N = 0xaabbccdd
Output: 0xddccbbaa
Input: N = 0xa912cbd4
Output: 0xd4cb12a9
天真的方法是提取适当的字节,即使用带移位运算符的mask(&)。
#define REV(x) ( ((x&0xff000000)>>24) | (((x&0x00ff0000)<<8)>>16) | (((x&0x0000ff00)>>8)<<16) |
((x&0x000000ff) << 24) )
高效的方法:
这个想法是只使用移位运算符。
- 使用左移运算符(<<)将最后一个字节的位置移到第一个字节。
- 使用右移运算符(>>)将第一个字节的位置移至最后一个字节。
- 使用左移和右移运算符组合移动中间字节。
- 将逻辑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