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
Zweierkomplement Umwandlung
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:
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.
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:
Hier als Anregung die Bitdarstellung (MSB links):
Hier als Anregung die Bitdarstellung (MSB links):
Code: Alles auswählen
lambda x,n: bin(2**n+x)[-n:]
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.
@BlackJack:
Ja geht auch mit Stringformatierung und Modulo (für die Überläufe).
@Killigen:
Hier für Hexausgabe und Breite in Bytes:
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)
Aus welchem Grund soll man da `lambda` nutzen?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)
@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.
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.
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 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.
@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.
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.
@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.
@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
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
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.
@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.
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.
@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
Das Leben ist wie ein Tennisball.