什么意思呢?就是将 ABCD 变成 DCBA。这里的ABCD代表字节。

这个方法是在嵌入式系统课程中学到的,效率很高,该方法只用了一个临时变量而且不使用循环语句。

方法如下:

1
2
3
4
5
6
7
unsigned long func(unsigned long v) {
unsigned long t;
t = v ^ ((v << 16) | (v >> 16));
t &= ~0xff0000;
v = (v << 24) | (v >> 8);
return v ^ (t >> 8);
}

第一步: t = v ^ ((v << 16) | (v >> 16)),得到

\[ 𝑣 = 𝐴𝐵𝐶𝐷、𝑡 = ABCD\oplus CDAB \]

第二步:t &= ~0xff0000,得到

~0xff0000 的结果为f0ff(字节为单位),则有 \[ 𝑣 = 𝐴𝐵𝐶𝐷、𝑡 = f0ff \& (ABCD\oplus CDAB) \]

​ 即 \[ 𝑣 = 𝐴𝐵𝐶𝐷、𝑡 = (A\oplus𝐶,0,C\oplus A,𝐷\oplus𝐵) \]

####第三步:v = (v << 24) | (v >> 8)

得到v = D000 | 0ABC

\[ v = DABC、𝑡 = \{A\oplus𝐶,0,C\oplus A,𝐷\oplus𝐵\} \]

第四步:v ^ (t >> 8)

t >>8得到

\[ 𝑡 = \{0,A\oplus𝐶,0,C\oplus A\} \]v ^ (t >> 8)得到 \[ 𝑣 = 𝐷𝐴𝐵𝐶\oplus\{0,A\oplus𝐶,0,C\oplus A\} \] ​ 最后 \[ v = DCBA \]

有关这方面的知识可以到这里了解,里面介绍了大量的位运算技巧