#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)