Tengo todo excepto la distancia de Hamming. Sigo recibiendo el error “int () no puede convertir una cadena sin base explícita”
Aquí está mi código:
def int2bin(n): if n: bits = [] while n: n,remainder = divmod(n, 2) bits.insert(0, remainder) return bits else: return [0] def bin2gray(bits): return bits[:1] + [i ^ ishift for i, ishift in zip(bits[:-1], bits[1:])] def hamming(a,b): assert len(a) == len(b) count,z = 0,int(a,2)^int(b,2) while z: count += 1 z &= z-1 return count def main(): a = int(input("Positive integer 1: ")) b = int(input("Positive integer 2: ")) print('int:%2i binary:%12r BRGC:%12r' % ( a, int2bin(a), bin2gray(int2bin(a)) )) print('int:%2i binary:%12r BRGC:%12r' % ( b, int2bin(b), bin2gray(int2bin(b)) )) print('hamming|%2 %12r &12r' % (hamming(int2bin(a),int2bin(b)), hamming(bin2gray(int2bin(a)),bin2gray(int2bin(b))) )) main()
la salida debe verse como
int: 5 binary: [1, 0, 1] brgc: [1, 1, 1] int: 6 binary: [1, 1, 0] brgc: [1, 0, 1] hamming 2 1
¡por favor ayuda!
Pruebe esta implementación (se espera que a y b
sean enteros):
def hamming(a, b): return bin(a^b).count('1')
Aquí, xor a
y b
y obtengo binario donde unos representan diferencias entre a
y b
. Que yo solo cuento unos.
En la función hamming
,
count,z = 0,int(a,2)^int(b,2)
Parece que está pasando una lista de enteros como los primeros argumentos ( b
) a la función int()
. El segundo argumento es tu base explícita. no puedes hacer esto
Intente reemplazar a
con ''.join(str(el) for el in a)
y lo mismo para b
.
Alternativamente, puede reemplazar la función int2bin
con format(n, 'b')
para obtener una cadena binaria directamente.
Este código calcula la distancia de Hamming de dos cadenas posiblemente bastante largas.
def hammingDist(s1,s2): if type(s1) is str: s1=s1.encode() if type(s2) is str: s2=s2.encode() count=0 for b1,b2 in zip(s1,s2): a=b1^b2 while a>0: count+= a & 1 a=a >> 1 return count