Zweierkomplement Umwandlung

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
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Hallo Leute,

ich möchte eine negative Integerzahl in eine Binärzahl bzw. Hexzahl umwandeln.

Folgende 3 Funktionen kenne ich bereits:
zahl = 10

binaer = bin(zahl)
hexadez = hex(zahl)

#back to int
int(binaer,2)
int(hexadez,16)

Das sind die Funktion um unsigned Zahlen in verschiedene Zahlensysteme zu konvertieren.
Ich möchte jedoch negative Dezimalzahlen im Zweierkomplement konvertieren und als binäre oder hexadezimale Zahl ausgeben. (und natürlich auch wieder zurück ins dezimale System)

Wie geht das?

Danke im Vorraus :)

Killigen
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Ebenso?

Code: Alles auswählen

>>> zahl=-256
>>> b=bin(zahl)
>>> b
'-0b100000000'
>>> z=int(b,2)
>>> z
-256
>>> h=hex(zahl)
>>> h
'-0x100'
>>> y=int(h,16)
>>> y
-256
>>> 
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Wie ebenso?

>>> print bin(-1)
-0b1

Lol... Das ist ja eine total dämliche Ausgabe :D

Einfach die 1 in binär umwandeln und ein Minus davor hängen :D

Ich will die Ausgabe als Zweierkomplement...
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Killigen:
Das ist keine dämliche Ausgabe, das ist dem Umstand geschuldet, dass Du für eine Zweierkomplementdarstellung die Wortbreite kennen musst, welche in Python aber nicht festgelegt ist, damit beliebig große Zahlen dargestellt werden können. Heisst Du legst Dir eine Wortebreite fest, erstellst das Zweierkomplement und hieraus eine Hexdarstellung. Fertig.
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Ähm ok!?

Hast du zufällig einen Code?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Killigen:
Hier als Anregung die Bitdarstellung (MSB links):

Code: Alles auswählen

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

Ich würde da ja eher `format()` verwenden, da kann man die Breite angeben und muss auch keine überflüssigen Zeichen am Anfang wieder loswerden.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@BlackJack:
Ja geht auch mit Stringformatierung und Modulo (für die Überläufe).

@Killigen:
Hier für Hexausgabe und Breite in Bytes:

Code: Alles auswählen

lambda x, n: "{:0{}X}".format(x % 256**n, n*2)
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Danke an alle!
Funktioniert jetzt :)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

jerch hat geschrieben:Hier für Hexausgabe und Breite in Bytes:

Code: Alles auswählen

lambda x, n: "{:0{}X}".format(x % 256**n, n*2)
Aus welchem Grund soll man da `lambda` nutzen?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@snafu:
Ich hab nix von "soll" geschrieben und musst Du ja auch nicht. Bei mir ist das die Angewohnheit, auch Einzeiler in Funktionen zu packen, wenn im Code, der thematisch zusammengehört, Variablen mehrfach genutzt werden.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

jerch hat geschrieben:Bei mir ist das die Angewohnheit, auch Einzeiler in Funktionen zu packen, wenn im Code, der thematisch zusammengehört, Variablen mehrfach genutzt werden.
Die Verwendung von Funktionen ist sicherlich sinnvoll. Ich bin jetzt mehr über das `lambda` gestolpert. Ich verstehe nicht, warum es an der Stelle eine anonyme Funktion sein soll. Verzeihung: "darf".
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@snafu:
Die Frage kann man sich generell für lambda in Python stellen, man kanns halt auch immer ausschreiben. Für selbstdokumentierenden Code würde ich auch die Langform bevorzugen. Da hier nur die Implementation und nicht ein fancy Name für die Funktion gefragt war, tuts das lambda.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@jerch: Mit dem Lambda gewinnst du in diesem Fall aber keinen Mehrwert. Jetzt stehen da statt nur drei offensichtlichen Variablen drei Stück und noch zusätzlich zwei Parameter. Eine "ordentliche" Funktion mit Namen hätte wenigstens noch den Vorteil, dass sie zusätzlich noch mit ihrem Namen dokumentiert.
Das Leben ist wie ein Tennisball.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@EyDu:
Irgendwie verstehe ich nicht, was Du mir mit dem zweiten Satz sagen willst.
Einen Mehrwert habe ich mit der Funktion - Wiederverbarkeit / einfacher Zugriff von Parametern auf Ergebnis - was man mit Funktionen halt so macht. Und mit Namen wär sie auch noch selbstredend/dokumentierend ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Richtig, den Vorteil hättest du bei einer Funktion mit einem Namen. Der Name erklärt die Aufgabe der Funktion und bringt die Parameter in einen Kontext. Mit einem Lambda-Ausdruck hast du nur ein namenloses Ding ohne Erklärung, die Parameter schwirren genau so in der Luft wie vorher, außer dass sie einmal am Anfang zusammengefasst sind, und wiederverwendbar ist ein für sich stehender Lambda-Ausdruck auch nicht. Was ich damit sagen will: Entweder man erstellt in so einem Fall eine Funktion mit def und vernünftigem Mehrwert, oder man lässt so einen billigen Einzeiler einfach so für sich stehen und produziert nicht noch überflüssigen Code. So ein herumfliegendes Lambda braucht man nicht.
Das Leben ist wie ein Tennisball.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@EyDu:
Ich vermute mal mit "ein für sich stehender Lambda-Ausdruck" meinst Du ungebunden. Der ist nicht nur nicht wiederverwendbar, der ist nicht benutzbar.
Worum es mir ging - den Einschluss in eine Funktion halte ich für sinnvoll, da es auch einen billigen Einzeiler einfach wiederverwendbar macht, die Variablen einschliesst und über die Parameter anzeigt, dass diese von aussen kommen müssen. Wie ich oben schon schrieb, ist mir der Name hier egal (mit hier meine ich hier im Forum) und daher verzichte ich im Codeschnipsel auf eine benannte Funktion. Der Schnipsel ist prototypisch, man kann ihn zur benannten Funktion umbauen oder sich einfach die Implementation rausholen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@jerch: Mir ist schon klar was was du bezwecken möchtest. Ich sehe, zumindest in diesem konkreten Fall, aber mehr Nach- als Vorteile. Jetzt müssen wir wohl mit verschiedenen Meinungen leben :D
Das Leben ist wie ein Tennisball.
Antworten