下面这一小段http://blog.csdn.net/corcplusplusorjava/article/details/17119567
使用雷德算法实现倒位序:
对于自然顺序(二进制)我们是在低位加 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
我的温馨提示,如果看了该博主的博文还没懂得话,那么自己手动模拟一下就会发现了,其实还挺简单的
我的代码
1 //看看会不会爆int! 或者绝对值问题。 2 #include <bits/stdc++.h> 3 using namespace std; 4 #define LL long long 5 #define pb push_back 6 #define mk make_pair 7 #define fi first 8 #define se second 9 #define all(a) a.begin(), a.end() 10 11 12 int main(){ 13 int a[8] = {0, 1, 2, 3, 4, 5, 6, 7}; 14 int n = 8; 15 for(int i = 0, j = 0; i < n; i++) {///雷德算法,正常的二进制是从序列的最左边开始+1,但是雷德算法是从最右边开始+1的。 16 ///k在这里表示的二进制的位数,然后j就是一个保存变量的东西,然后我们利用k,每次在序列的最右边开始判断,如果是1的,就变为0(这个在j|k中体现),如果是0的就变为1 17 if(j > i) swap(a[i], a[j]), printf("i = %d j = %d ", i, j); 18 int k = n; 19 while(j & (k >>= 1)) j &= ~k; 20 j |= k; 21 printf("j = %d k = %d ", j, k); 22 } 23 for (int i = 0; i < n; i++){ 24 printf("%d%c", a[i], i == n-1 ? ' ' : ' '); 25 } 26 return 0; 27 }