#########################################################
# knihovnicka na praci s Greyovym kodem
# Jan Prochazka, 2007
#########################################################
## DEC vs. GREY

def dec2grey(c):
    #prevede dekadicke cislo na Greyuv kod
    rad=2
    ret=[]
    pom=2
    while(pom>=1.5):
        pom=(c*1.0)/rad + 0.5
        if(int(pom)%2 == 0):
            ret=[0]+ret
        else:
            ret=[1]+ret
        rad*=2
    if(c==0):
        ret=[0]
    return ret

def grey2dec(g):
    #prevede Greyuv kod na dekadicke cislo
    ret=0
    pom=1
    sgn=1
    for i in range(len(g)):
        if(g[-1-i]==1): #od konce
            ret+=sgn*pom
            sgn=-sgn
        pom=((pom+1)*2)-1 #1,3,7,15,..,[(2**n)-1]
    return abs(ret)

#########################################################
## BIN vs. GREY

def bin2grey(b):
    #prevede dvojkovy zapis cisla do Greyova kodu
    pole=[0]+b
    ret =[]
    for i in range(1,len(pole)):
        if(pole[i-1]==pole[i]):
            ret+=[0]
        else:
            ret+=[1]
    return ret

def grey2bin(g):
    #prevede Greyuv kod do dvojkoveho zapisu cisla
    pole=g
    ret=[0]
    for i in range(len(pole)):
        if(pole[i]==ret[-1]): #ret[-1] ~ posl. mezivysledek
            ret+=[0]
        else:
            ret+=[1]
    return ret[1:]

#########################################################
## BIN vs. DEC

def bin2dec(b):
    #prevede dvojkovy zapis cisla na dekadicky
    ret=0
    pom=1
    for i in xrange(len(b)):
        if(b[-1-i]==1):
            ret+=pom
        pom*=2
    return ret

def dec2bin(d):
    #prevede dekadicky zapis cisla na dvojkovy
    ret=[]
    while (d>0):
        ret=[d%2]+ret
        d=d/2
    if (ret==[]):
        ret=[0]
    return ret

#########################################################
## debug:

#def test(od,po):
#    err=False
#    for i in xrange(od,po):
#        if(i!=grey2dec(dec2grey(i))):
#            err=True
#            print "Nefunguje pro", i
#    return err
#
#a=0
#b=100000
#print "TEST pro interval [",a,";",b,"]:"
#if (test(a,b)):
#    print "TEST dokoncen neuspesne!"
#else:
#    print "TEST dokoncen uspesne!"
#
#####

#####
#for i in xrange(40000):
#    a=bin2grey(dec2bin(i))
#    b=dec2grey(i)
#    if(a!=b):
#        print i, a==b
#        print "  ", a, "mam:",b
#
#########################################################
