将一个字(32 bit)按字节反转的方法
什么意思呢?就是将 ABCD 变成 DCBA。这里的ABCD代表字节。
这个方法是在嵌入式系统课程中学到的,效率很高,该方法只用了一个临时变量而且不使用循环语句。
方法如下:
1 | unsigned long func(unsigned long v) { |
第一步: 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
\]
有关这方面的知识可以到这里了解,里面介绍了大量的位运算技巧