Seite 1 von 1

Zweierkomplement für negative Dezimalzahl anzeigen lassen

Verfasst: Mittwoch 2. November 2011, 16:55
von snafu
Ich erlerne gerade die Darstellung von Werten in diversen Zahlensystemen, inbesondere dem binären. So weit steige ich inzwischen ganz gut dahinter, nur das Zweierkomplement macht mir noch Probleme. Ich gehe so vor, dass ich meine Ergebnisse händisch errechne und dann in Python überprüfe, ob das Ergebnis richtig ist, z.B. mittels `bin(5)` bzw `int('101', 2)`. Wenn ich nun das Zweierkomplement von -7 errechnet habe, wie prüfe ich dies in Python am Besten auf Korrektheit und wie wäre der umgekehrte Weg, also von Komplement auf dezimal?

Re: Zweierkomplement für negative Dezimalzahl anzeigen lasse

Verfasst: Mittwoch 2. November 2011, 17:19
von DasIch
Es macht doch gar keine Unterschied ob die Zahl positiv oder negativ ist, ``bin(-7)`` und ``int('-111', 2)`` funktioniert.

Re: Zweierkomplement für negative Dezimalzahl anzeigen lasse

Verfasst: Mittwoch 2. November 2011, 17:24
von EyDu
@snafu: Eine Funktion zu schreiben, welche dir die Bits einer Zahl ausgibt, sollte eigentlich in < 5 Minuten ohne Nachdenken erledigt sein ;-)

@DasIch: Natürlich macht es einen Unterschied, da es um die interne Darstellung geht.

Re: Zweierkomplement für negative Dezimalzahl anzeigen lasse

Verfasst: Donnerstag 3. November 2011, 10:09
von snafu
@EyDu: Gut, den bekannten Rechenvorgang einfach als Funktion zu implementieren, wäre natürlich die naheliegende Alternative. Beim Verfassen des Beitrags hatte ich aber noch eine gewisse Unsicherheit, ob ich den Ablauf (Auffüllen mit Nullen falls nötig, sowie Streichen von "überschüssigen" Überträgen) richtig verstanden habe. Daher die Suche nach etwas Fertigem, und damit auch Korrektem.

@DasIch: Das Zweierkomplement von -7 ist mit Sicherheit nicht -111, allein schon wegen dem Vorzeichen.

Re: Zweierkomplement für negative Dezimalzahl anzeigen lasse

Verfasst: Donnerstag 3. November 2011, 10:44
von snafu
Habe jetzt bitstring gefunden, welches sich genau mit solchen Fragen befasst:

Code: Alles auswählen

>>> BitArray(int=-14, length=5).bin
'0b10010'

Re: Zweierkomplement für negative Dezimalzahl anzeigen lasse

Verfasst: Freitag 4. November 2011, 09:47
von EyDu
Nachimplementieren wäre warscheinlich die lehrreichste Alternative, scheint mir aber viel zu anstregend ;-)

Code: Alles auswählen

>>> def as_binary(x, length=32):
...     return "".join(str((x & (1<<i)) >> i) for i in range(length))[::-1]
... 
>>> as_binary(10)
'00000000000000000000000000001010'
>>> as_binary(-10)
'11111111111111111111111111110110'
>>>
Ein fertiges Modul ist natürlich trotzdem schöner.

Re: Zweierkomplement für negative Dezimalzahl anzeigen lasse

Verfasst: Freitag 4. November 2011, 19:13
von jerch
zu faul zum Nachimplementieren:

Code: Alles auswählen

lambda x,n: bin(2**n+x)[-n:]

Re: Zweierkomplement für negative Dezimalzahl anzeigen lasse

Verfasst: Freitag 4. November 2011, 23:42
von snafu
jerch hat geschrieben:zu faul zum Nachimplementieren:

Code: Alles auswählen

lambda x,n: bin(2**n+x)[-n:]
Genial. :)