Seite 1 von 1

Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 09:19
von Killigen
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

Re: Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 09:27
von sparrow
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
>>> 

Re: Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 09:33
von Killigen
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...

Re: Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 09:42
von jerch
@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.

Re: Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 09:43
von Killigen
Ähm ok!?

Hast du zufällig einen Code?

Re: Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 10:19
von jerch
@Killigen:
Hier als Anregung die Bitdarstellung (MSB links):

Code: Alles auswählen

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

Re: Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 10:37
von 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.

Re: Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 11:18
von jerch
@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)

Re: Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 14:17
von Killigen
Danke an alle!
Funktioniert jetzt :)

Re: Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 15:49
von snafu
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?

Re: Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 16:01
von jerch
@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.

Re: Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 16:14
von snafu
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".

Re: Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 17:35
von jerch
@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.

Re: Zweierkomplement Umwandlung

Verfasst: Montag 30. März 2015, 20:19
von EyDu
@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.

Re: Zweierkomplement Umwandlung

Verfasst: Dienstag 31. März 2015, 00:50
von jerch
@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 ;)

Re: Zweierkomplement Umwandlung

Verfasst: Dienstag 31. März 2015, 07:05
von EyDu
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.

Re: Zweierkomplement Umwandlung

Verfasst: Dienstag 31. März 2015, 09:09
von jerch
@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.

Re: Zweierkomplement Umwandlung

Verfasst: Dienstag 31. März 2015, 09:26
von EyDu
@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