Zweierkomplement für negative Dezimalzahl anzeigen lassen
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?
@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.
@DasIch: Natürlich macht es einen Unterschied, da es um die interne Darstellung geht.
Das Leben ist wie ein Tennisball.
@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.
@DasIch: Das Zweierkomplement von -7 ist mit Sicherheit nicht -111, allein schon wegen dem Vorzeichen.
Habe jetzt bitstring gefunden, welches sich genau mit solchen Fragen befasst:
Code: Alles auswählen
>>> BitArray(int=-14, length=5).bin
'0b10010'Nachimplementieren wäre warscheinlich die lehrreichste Alternative, scheint mir aber viel zu anstregend 
Ein fertiges Modul ist natürlich trotzdem schöner.
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'
>>>Das Leben ist wie ein Tennisball.
zu faul zum Nachimplementieren:
Code: Alles auswählen
lambda x,n: bin(2**n+x)[-n:]Genial.jerch hat geschrieben:zu faul zum Nachimplementieren:Code: Alles auswählen
lambda x,n: bin(2**n+x)[-n:]
