2 дополнения реализации Python - PullRequest
0 голосов
/ 30 октября 2019

Я хочу определить функцию complement, которая дает мне 2'дополнение десятичного числа. Сначала я определяю функцию ntobasetwo, которая принимает десятичное число в качестве аргумента и выводит двоичное число длиной c в виде списка (слева направо). Затем двоичное число будет перевернуто с помощью функции umklappen, а функция complement добавит 1 бит к перевернутому двоичному числу.

Функция complement дает неправильный результат, и я не уверенпочему.

# Funktion, die ganze Zahlen im Dezimalsystem als Zahlen im Dualsystem darstellt
import numpy as np
import math



# Decimal number is converted into binary by dividing the number successively by 2
# and printing the remainder in reverse order
def  ntobasetwo(n,c):
    binary = []
    while n!= 0:
        bit = n%2
        binary.insert(0,bit)
        n = n//2
    if len(binary)>c:
        binary = binary[0:c]
    if len(binary)<c:
        for i in range(c-len(binary)):
                binary.insert(i,0)
    return binary

bin_3 = ntobasetwo(3,4)
print(bin_3)

bin_1248 = ntobasetwo(1248,8)
print(bin_1248)

def umklappen(binList):
    for i in range(len(binList)):
        if binList[i] == 0:
            binList[i] = 1
        else:
            binList[i] = 0
    return binList

umklappen_bin_3 = umklappen(bin_3)
print(umklappen_bin_3)

def complement(aList1,aList2):
    maxlen = max(len(aList1),len(aList2))
    if len(aList1) < len(aList2):
        for i in range(len(aList2)-len(aList1)):
            aList1.insert(i,0)
    if len(aList2) < len(aList1):
        for i in range(len(aList1)-len(aList2)):
            aList2.insert(i,0)


    result =[]
    carry = 0

    for i in range(maxlen-1,-1,-1): #traverse through the list starting with the last element
        r = carry
        r += 1 if aList1[i] == 1 else 0
        r += 1 if aList2[i] == 1 else 0
        # r can be 0,1,2,3 (carry + x[i] + y[i])
        # for r==1 and r==3 you will have result bit = 1
        # for r==2 and r==3 you will have carry = 1

        if r%2 == 1:
            result.insert(i,1)
        else:
            result.insert(i,0)
        carry = 0 if r<2 else 1
    if carry != 0:
        result.insert(i,1)

    return result

print(complement(umklappen_bin_3, [1]))
...