位反转运算快速实现
#encoding:utf-8 def odda(a): for k in range(1,m): for j in range(0,k): j1 = j + ip[k] k1 = k + ip[j] swap(a,j1,k2) j1 += m k1 += m swap(a,j1,k1) print a def swap(a,j1,k1): print j1,k1 t1 = a[j1] t2 = a[k1] a[j1] = t2 a[k1] = t1 return a def evena(a): for k in range(0,m): for j in range(0,k): #00情况 j1 = j + ip[k] k1 = k + ip[j] swap(a,j1,k1) #01 10情况 j1 += m k1 += 2*m swap(a,j1,k1) #10 01 情况 j1 += m k1 -= m swap(a,j1,k1) #11 11情况 j1 += m k1 += 2*m swap(a,j1,k1) print "\n" #j=k的情况下在偶数交换位状态的中间01情况下需要交换 j1 = k+m+ip[k]#ip[k]+k+m k1 = j1 + m #ip[k] +k +2m swap(a,k1,j1) print "********" print a n = 32*2 m = 1 l = n ip = [] a = [] for i in range(0,n): ip.append(0) a.append(i) cnt = 0 while (m<<2 < l): cnt += 1 l>>=1 for i in range(0,m): ip[m+i] = ip[i] + l m <<= 1 print "l,m",l,m print ip print m<<2,l if m<<2 == l: evena(a) else: odda(a)