使用雷德算法实现倒位序:
对于自然顺序(二进制)我们是在低位加 1 得到下一位数,对于倒位序我们是在高位加 1 向低位进位。比如已知一个倒位序数是J求其下一个倒位序数,N位总数 ,把J与N/2比较若J<N/2则J的最高位为 0 ,把最高位置 1 ,就得到了J的下一个倒位序数;若J>=N/2则说明J的最高位为1 ,把最高位置0 ,比较次高位,若次高位为0 ,则把次高位置1,得到J的下一个倒位序,若次高位为1 , 则把次高位置0,以此类推...
以N = 8 为例:
倒位数顺序 倒位数 十进制
000 000 0
001 100 4
010 010 2
011 110 6
100 001 1
101 101 5
110 011 3
111 111 7
使用算法实现:(当顺序位序小于到序位序要变序)
#include <iostream>
using namespace std;
int x[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int y[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int N = 8;
int main()
{
int i,j,k;
int temp;
for(j=0,i=0;i<N-1;i++) //这里实现了奇偶前后分开排序
{
if(i<j) //如果i<j,即进行变址
{
temp = x[j];
x[j] = x[i];
x[i] = temp;
}
k = N/2; //求j的下一个倒位序
while(j >= k) //如果k<=j,表示j的最高位为1
{
j = j-k; //把最高位变成0
k = k/2; //k/2,比较次高位,依次类推,逐个比较,直到某个位为0
}
j = j+k; //把0改为
}//for()
for(i = 0 ; i < N ; ++ i)
{
printf("%2d %2d\n" , i , x[i]) ;
}
system("pause") ;
return 0 ;
}