2016-11-03 7 views
1

예를 들어 -2 또는 -8을 입력하면 110, 11000이됩니다. 최소 이진수를 사용해야하므로 10, 1000을 얻고 싶습니다. 그래서 나는 부정적인 방법에 다른 방법을 사용해야합니다. LSB 1에 도달 할 때까지 1과 0을 바꿔 쓰려고했지만 길을 찾을 수 없습니다.10 진수에서 2 진수로 : 2의 보수, 음수 표현이 더 우수합니다.

(당신을 도울 : dekadikos = demical, diadikos = 이진, boith = 보조)

dekadikos = input() 
while dekadikos != "end" : 
    dekadikos = int(dekadikos) 
    if dekadikos > 0 : 
     diadikos = bin(dekadikos) 
     diadikos = (diadikos[2:]) 
     n = int(len(diadikos)) + 1 
     print(diadikos.zfill(n)) 
    elif dekadikos == 0 : 
     diadikos = bin(dekadikos) 
     diadikos = (diadikos[2:]) 
     print(diadikos) 
    else : 
     dekadikos = abs(dekadikos) 
     diadikos = bin(dekadikos) 
     diadikos = (diadikos[2:]) 
     n = int(len(diadikos)) + 1 
     diadikos = diadikos.zfill(n) 
     boithdekadikos = 2**n - dekadikos 
     diadikos = bin(boithdekadikos) 
     diadikos = diadikos[2:] 
     print (diadikos) 
dekadikos = input() 
+0

하여 최소의 2의 보수 표기에서 :

당신은 제로 부정을 긍정적 커버하는 대신이 일을 할 수 있습니까? – 3Doubloons

+0

demical : 2는 2 진수입니다 : 10 – giorgosan

+0

10 진수 2가 10이고 -2가 10이 되길 원한다면, 10을 -2로, 10을 -2로 어떻게 구별 할 것입니까? – 3Doubloons

답변

1

당신은 (주석) 마지막 else 블록의 코드에 두 변경하여 그것을 해결할 수 :

else : 
    dekadikos = abs(dekadikos) 
    diadikos = bin(dekadikos-1) # subtract 1 
    diadikos = (diadikos[2:]) 
    n = int(len(diadikos)) + (dekadikos>1) # add 1 except for 1 
    diadikos = diadikos.zfill(n) 
    boithdekadikos = 2**n - dekadikos 
    diadikos = bin(boithdekadikos) 
    diadikos = diadikos[2:] 
    print (diadikos) 

원하는 결과를 얻으려면 시간이 오래 걸리는 것처럼 보입니다. 하나의 경우 format(dekadikos, 'b')을 사용하여 0b 접두어가없는 숫자의 이진 표현을 얻을 수 있습니다. 당신이 2을 작성하는 방법,

dekadikos = int(dekadikos) 
diadikos = '0' + format(abs(dekadikos)-(dekadikos<0), 'b') 
if dekadikos == 0: 
    diadikos = '0' 
elif dekadikos < 0: 
    diadikos = format(2**(len(diadikos)-(dekadikos==-1)) + dekadikos, 'b') 
print (diadikos)