Zweierkomplement für negative Dezimalzahl anzeigen lassen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Es macht doch gar keine Unterschied ob die Zahl positiv oder negativ ist, ``bin(-7)`` und ``int('-111', 2)`` funktioniert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Habe jetzt bitstring gefunden, welches sich genau mit solchen Fragen befasst:

Code: Alles auswählen

>>> BitArray(int=-14, length=5).bin
'0b10010'
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

zu faul zum Nachimplementieren:

Code: Alles auswählen

lambda x,n: bin(2**n+x)[-n:]
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

jerch hat geschrieben:zu faul zum Nachimplementieren:

Code: Alles auswählen

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