Da bin ich wieder
Mein Thema heute: Python - effiziente Wege durch verschiedene Zahlensysteme
Ausgangspunkt sind HEX-Bytes, Ziel sind die Dezimalwerte bestimmter Bitfolgen. Also z.B. Bits 1-6:
HEX = D1
BIN = 11010001
Bit[1:6] = 010001
DEZ = 17
So weit ich weiss gibt es keine Python Funktionen die diese Berechnungen direkt unterstützen. Ich habe schon verschiedene Implementierungen von Umrechnungsfunktionen gefunden - wenn jemand von Euch bereits Erfahrungen gesammelt hat und eine Empfehlung aussprechen könnte wäre das natürlich hilfreich.
Auch hatte ich überlegt für häufig zu berechnende Bitfolgen Dictionaries anzulegen in denen dann z.B. zu jedem HEX-Wert der entsprechende Dezimalwert der ersten 6 Bits abgelegt ist. Wäre das hinsichtlich der Performance eine gute Alternative?
Besten Dank vorab!
Von HEX über Binär zu Dezimal
Ich hatte mal 'ne wirklich simple Funktion zum Umrechnen von Dezimal nach Binär:
Achja... wenn du mit "Bit[ 1:6]" "BIN[ 1:6]" meintest, dann sollte die Ausgabe nicht "010001" lauten, denn man beginnt ja links und nicht rechts.
Oder irre ich mich da grad >.<
Code: Alles auswählen
def DecToBin( DecNum):
Bin = ''
while ( DecNum != 0):
b = str( DecNum %2)
Bin = str( Bin)
Bin = b + Bin
DecNum = DecNum /2
if Bin == '':
Bin = '0'
return Bin
Oder irre ich mich da grad >.<
Da ich diese Umrechnung millionenfach brauche ist simpel oder nicht eher sekundär - performant muss es sein. Ich werde mal testen - danke!DarXun hat geschrieben:Ich hatte mal 'ne wirklich simple Funktion
BIN[ 1:6] wäre natürlich von links, die Bits zähle ich aber von rechts.DarXun hat geschrieben:Achja... wenn du mit "Bit[ 1:6]" "BIN[ 1:6]" meintest, dann sollte die Ausgabe nicht "010001" lauten, denn man beginnt ja links und nicht rechts. Oder irre ich mich da grad >.<
Du könntest dir die Umrechnung mit C oder C++ als Modul schreiben.
Hier noch ein Link zum Thema: Zahlensysteme.
Hier noch ein Link zum Thema: Zahlensysteme.
[code]q = 'q = %s; print q %% repr(q)'; print q % repr(q) [/code]
- veers
- User
- Beiträge: 1219
- Registriert: Mittwoch 28. Februar 2007, 20:01
- Wohnort: Zürich (CH)
- Kontaktdaten:
Code: Alles auswählen
In [2]: hex(666)
Out[2]: '0x29a'
In [6]: int("0x29a", 16)
Out[6]: 666
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
@DarXun: Die Funktion würde korrekter `IntToBin` heissen. Da wird eine ganze Zahl übergeben. Zahlen haben keine Basis, nur Darstellungen davon.
@Schnäik: Python stellt für so etwas die gleichen Werkzeuge zur Verfügung wie C und die meisten Sprachen: Bitweise Verknüpfungen.
@Schnäik: Python stellt für so etwas die gleichen Werkzeuge zur Verfügung wie C und die meisten Sprachen: Bitweise Verknüpfungen.
Code: Alles auswählen
In [352]: int('D1', 16) & ((1 << 6) - 1)
Out[352]: 17
Sag das doch gleich Danke für die Info!BlackJack hat geschrieben:@Schnäik: Python stellt für so etwas die gleichen Werkzeuge zur Verfügung wie C und die meisten Sprachen: Bitweise Verknüpfungen.
Code: Alles auswählen
In [352]: int('D1', 16) & ((1 << 6) - 1) Out[352]: 17
Was ist denn Deiner Meinung nach performanter: Deine obige Berechnung oder die Abfrage eines Dictionaries? Tippe mal auf ersteres?
Zuletzt geändert von Schnäik am Montag 18. Februar 2008, 01:26, insgesamt 1-mal geändert.
Am besten machst Du's so wie's Dir am verständlichsten erscheint und wenn das zu langsam sein sollte, testest Du Alternativen aus, ob die schneller sind.
Wenn es immer nur die untersten 6 Bit sind, reicht übrigens der letzte Buchstabe eines Hex-Wertes aus.
Wenn es immer nur die untersten 6 Bit sind, reicht übrigens der letzte Buchstabe eines Hex-Wertes aus.