введите 2 целых числа и получите двоичное число, brgc и расстояние Хэмминга

У меня есть все, кроме дистанции Хэмминга. Я продолжаю получать сообщение об ошибке «int () не может преобразовать нестроку с явной базой»

вот мой код:

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

вывод должен выглядеть

int: 5 binary: [1, 0, 1] brgc: [1, 1, 1]    
int: 6 binary: [1, 1, 0] brgc: [1, 0, 1]    
hamming            2               1

пожалуйста помоги!


person Joe    schedule 12.11.2015    source источник


Ответы (3)


Попробуйте эту реализацию (ожидается, что a и b будут целыми числами):

def hamming(a, b):
    return bin(a^b).count('1')

Здесь я исключаю a и b и получаю двоичный код, где единицы представляют разницу между a и b. Чем я просто считаю единицы.

person Rugnar    schedule 23.11.2015

В функции hamming,

count,z = 0,int(a,2)^int(b,2)

похоже, вы передаете список целых чисел в качестве первых аргументов (a и b) функции int(). второй аргумент - это ваша явная база. ты не можешь этого сделать.

Попробуйте заменить a на ''.join(str(el) for el in a) и то же самое на b.

В качестве альтернативы вы можете заменить функцию int2bin на format(n, 'b'), чтобы напрямую получить двоичную строку.

person Gabriel    schedule 12.11.2015

Этот код вычисляет расстояние Хэмминга двух, возможно, довольно длинных строк.

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
person stupidquestionsmadesimple    schedule 12.02.2019