这个位在一个字节中的恢复如何工作?

Alo*_*pex 1 c bit-manipulation bit-shift bitwise-operators or-operator

我是编程的新手,我发现这种方法可以反转C中一个字节的位:

//(10000011) -> (11000001)

unsigned char reverse(unsigned char b) {
   b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
   b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
   b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
   return b;
}
Run Code Online (Sandbox Code Playgroud)

由用户发布以回答此问题,但我无法理解它是如何工作的.这些常数意味着什么?

dbu*_*ush 5

查看上述数字的二进制表示可能会有所帮助:

0xF0: 11110000
0x0F: 00001111

0xCC: 11001100
0x33: 00110011

0xAA: 10101010
0x55: 01010101
Run Code Online (Sandbox Code Playgroud)

第一对数字用于屏蔽掉并交换一个字节的前4位和后4位.

第二对屏蔽掉并交换一组4位的前2位和后2位.

第三对屏蔽掉并交换相邻的位对.