Предполагается, что функция умножает 2 двоичных числа (без специальных функций), но это не так

Вот функция, которая принимает 2 двоичных числа (str) в виде 8 знаков (например, 4=00000100). в формуле нам нужно перевернуть второе число и для каждого бита отдельно выполнить следующие действия:

  1. Если это 1, то мы добавляем 1-е двоичное число в старший регистр, затем добавляем в качестве первого числа 1, если у нас была перенаселенность, или 0, если нет, затем мы берем последнее число в старшем регистре и помещаем его в 1-е число нижнего регистра. регистр, после чего удаляем последний элемент в нижнем регистре.
  2. Если бит равен 0, мы просто добавляем 0 в начало старшего регистра (HG), добавляем последнее число HG и помещаем его в 1-е число (LG) и удаляем последние биты в HG и LG. Затем мы просто соединяем HG и LG и получаем результат.

выглядит так: 3*4 = 12: 00000011(bin1) * 00000100(bin2) = 00000000 00001100 (результат) шаги: мы берем перевернутый bin2 и наблюдаем за каждым битом

  1. первый = 0: поэтому средний результат = 00000000 00000000, то же самое для второго, так как он = 0
  2. бит=1, суммируем bin1 и 00000000=00000011, среднее разрешение=00000001 10000000
  3. бит = 0, поэтому среднее разрешение = 00000000 11000000. финал: 00000000 00001100

Пожалуйста, буду очень благодарен за любую помощь, очень тяжело справляюсь с этой задачей.

def result_first_diapazone(bin1, bin2): 
    carry = 0
    elder_result_list = ['0', '0', '0', '0', '0', '0', '0', '0'] 
    younger_result_list = ['0', '0', '0', '0', '0', '0', '0', '0'] 
    bin1_list = list(reversed(bin1))
    bin2_list = list(reversed(bin2))

    for bit in bin2_list:
        if bit == '1':
            for i, (x, y) in enumerate(zip(bin1_list, reversed(elder_result_list))):
                if (x, y) == ('0', '0') and carry == 0:
                    elder_result_list[i] = '0'
                    carry = 0
                elif (x, y) == ('0', '0') and carry == 1:
                    elder_result_list[i] = '1'
                    carry = 0
                elif (x, y) == ('1', '0') and carry == 0:
                    elder_result_list[i] = '1'
                    carry = 0
                elif (x, y) == ('1', '0') and carry == 1:
                    elder_result_list[i] = '0'
                    carry = 1
                elif (x, y) == ('0', '1') and carry == 0:
                    elder_result_list[i] = '1'
                    carry = 0
                elif (x, y) == ('0', '1') and carry == 1:
                    elder_result_list[i] = '0'
                    carry = 1
                elif (x, y) == ('1', '1') and carry == 0:
                    elder_result_list[i] = '0'
                    carry = 1
                elif (x, y) == ('1', '1') and carry == 1:
                    elder_result_list[i] = '1'
                    carry = 1
                else:
                    elder_result_list[i] = '1'
                    carry = 1
            elder_result_list.append(str(carry))
            elder_result_list.pop(0)
        else:
            elder_result_list.append('0')
            elder_result_list.pop(0)
    elder_result_list = reversed(elder_result_list)
    elder_result_str = ''.join(map(str, elder_result_list))
    younger_result_str = ''.join(map(str, younger_result_list))
    result_result = elder_result_str + ' ' + younger_result_str
    return result_result

Я пытался изменить этот код, но он правильный, как мне кажется по логике, которую я написал ранее.

Это требует более четкого объяснения и включает пример входных данных и желаемый и фактический результат.

Mark Tolonen 12.04.2024 21:50

@MarkTolonen Я изменил сообщение в соответствии с твоим комментарием, не мог бы ты взглянуть на него еще раз? :)

JaySi 12.04.2024 22:55

«Вот функция, которая принимает 2 двоичных числа в виде 8 знаков». Вам необходимо описать тип объекта и его значение. 00000100 ничего не значит в Python. Это str? list из int объектов? Пожалуйста, будьте точны

juanpa.arrivillaga 12.04.2024 23:02

Вы выполняете цикл elder_result_list в обратном порядке, но при назначении elder_result_list[i] обновляете его в прямом порядке. Это кажется неправильным.

Barmar 12.04.2024 23:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас много проблем с вашим кодом:

  1. Вы не используете: younger_result_list. Предполагается, что это будет содержать результат низкого порядка.
  2. Вы повторяете elder_result_list в обратном порядке, но обновляете его, используя прямые индексы.
  3. Строки: elder_result_list.pop(0) удаляет результаты не с того конца.

Я переписал его следующим образом: я использую временный список result_list для хранения результатов сложения, удаляю правильный бит из elder_result_list и добавляю его в younger_result_list:

def result_first_diapazone(bin1, bin2):
    carry = 0
    elder_result_list = ['0', '0', '0', '0', '0', '0', '0', '0']
    younger_result_list = []
    bin1_list = list(reversed(bin1))
    bin2_list = list(reversed(bin2))

    for bit in bin2_list:
        if bit == '1':
            result_list = []
            for i, (x, y) in enumerate(zip(bin1_list, reversed(elder_result_list))):
                if (x, y) == ('0', '0') and carry == 0:
                    result_list.append('0')
                    carry = 0
                elif (x, y) == ('0', '0') and carry == 1:
                    result_list.append('1')
                    carry = 0
                elif (x, y) == ('1', '0') and carry == 0:
                    result_list.append('1')
                    carry = 0
                elif (x, y) == ('1', '0') and carry == 1:
                    result_list.append('0')
                    carry = 1
                elif (x, y) == ('0', '1') and carry == 0:
                    result_list.append('1')
                    carry = 0
                elif (x, y) == ('0', '1') and carry == 1:
                    result_list.append('0')
                    carry = 1
                elif (x, y) == ('1', '1') and carry == 0:
                    result_list.append('0')
                    carry = 1
                elif (x, y) == ('1', '1') and carry == 1:
                    result_list.append('1')
                    carry = 1
                else:
                    result_list.append('1')
                    carry = 1
            result_list.append(str(carry))
            elder_result_list = list(reversed(result_list))
        else:
            elder_result_list.insert(0,'0')
        low = elder_result_list.pop()
        younger_result_list.append(low)

    elder_result_str = ''.join(map(str, elder_result_list))
    younger_result_str = ''.join(map(str, reversed(younger_result_list)))
    result_result = elder_result_str + ' ' + younger_result_str
    return result_result

Пример кода для расчета 42*42=1764:

result = result_first_diapazone('00101010', '00101010')
print(result)

Выход:

00000110 11100100

Обновлять:

addition_table = {
    ('0', '0', '0'): ('0', '0'),
    ('0', '0', '1'): ('1', '0'),
    ('0', '1', '0'): ('1', '0'),
    ('0', '1', '1'): ('0', '1'),
    ('1', '0', '0'): ('1', '0'),
    ('1', '0', '1'): ('0', '1'),
    ('1', '1', '0'): ('0', '1'),
    ('1', '1', '1'): ('1', '1')
}


def binary_add(augend, addend):
    result = ['0'] * 8
    carry = '0'
    for i, (x, y) in enumerate(zip(augend, addend)):
        result[i], carry = addition_table[(x, y, carry)]
    return result, carry


def binary_multiply(multiplier, multiplicand):
    upper_result_list = ['0'] * 8
    lower_result_list = []

    for bit in multiplier:
        if bit == '1':
            upper_result_list, carry = binary_add(multiplicand, upper_result_list)
            upper_result_list.append(carry)
        else:
            upper_result_list.append('0')

        low = upper_result_list.pop(0)
        lower_result_list.append(low)
    return upper_result_list, lower_result_list

def l_r(i):
    return list(reversed(i))

def result_first_diapazone(multiplier, multiplicand):
    upper, lower = binary_multiply(l_r(multiplier), l_r(multiplicand))
    return ''.join(reversed(upper))+ ' ' + ''.join(reversed(lower))

Вывод как указано выше.

Обратите внимание, что мой первый пример кода в некоторых случаях выдает неправильный результат, поскольку переменная carry определена слишком рано. Он должен быть внутри первого цикла for, а не в начале. Мой обновленный код все делает правильно, поскольку он является частью функции binary_add().

Я работаю над некоторыми упрощениями, поэтому следуйте этому ответу, чтобы получать уведомления.

quamrana 13.04.2024 12:07

Другие вопросы по теме