Я хочу определить функцию 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]))