1、问题 :
把一个32位的数按位反转,就是第32位转到第1位,第31位转到第2位…………
什么样的算法最节省效率?
2、解答 :http://www.yuanma.org/data/2007/0723/article_2763.htm
un
signed
int
bit_reverse(
unsigned
int
n)
{
n =
(
(
n >
>
1)
&
0x55555555)
|
(
(
n <
<
1)
&
0xaaaaaaaa)
;
n =
(
(
n >
>
2)
&
0x33333333)
|
(
(
n <
<
2)
&
0xcccccccc)
;
n =
(
(
n >
>
4)
&
0x0f0f0f0f)
|
(
(
n <
<
4)
&
0xf0f0f0f0)
;
n =
(
(
n >
>
8)
&
0x00ff00ff)
|
(
(
n <
<
8)
&
0xff00ff00)
;
n =
(
(
n >
>
16)
&
0x0000ffff)
|
(
(
n <
<
16)
&
0xffff0000)
;
return
n;
}
第一行代码为奇偶位相互交换;第二行为以两位为一单元,奇偶单元进行交换;第三行为以四位为一单元,奇偶单元进行交换;第四行为以八位为一单元,奇偶单元进行交换;最后一行为以十六位为一单元,奇偶单元进行交换。至此,32位反转完成,算法结束。
3、演绎: http://blog.youkuaiyun.com/sailor_8318/archive/2007/08/29/1764477.aspx
上述奇偶、 2 、 4 、 8 、 16 的交换方法可以演变有 四种实现形式,本质一样 ,可以都先移后取、都先取后移以及一个先移后取、另一个先取后移