Von HEX über Binär zu Dezimal

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
Schnäik
User
Beiträge: 10
Registriert: Freitag 8. Februar 2008, 17:27

Sonntag 17. Februar 2008, 20:31

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!
DarXun
User
Beiträge: 21
Registriert: Montag 21. Januar 2008, 00:44

Sonntag 17. Februar 2008, 20:39

Ich hatte mal 'ne wirklich simple Funktion zum Umrechnen von Dezimal nach Binär:

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
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 >.<
Schnäik
User
Beiträge: 10
Registriert: Freitag 8. Februar 2008, 17:27

Sonntag 17. Februar 2008, 21:22

DarXun hat geschrieben:Ich hatte mal 'ne wirklich simple Funktion
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: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 >.<
BIN[ 1:6] wäre natürlich von links, die Bits zähle ich aber von rechts.
Benutzeravatar
Craven
User
Beiträge: 223
Registriert: Dienstag 24. Januar 2006, 13:37

Sonntag 17. Februar 2008, 21:35

Du könntest dir die Umrechnung mit C oder C++ als Modul schreiben.

Hier noch ein Link zum Thema: Zahlensysteme.
[code]q = 'q = %s; print q %% repr(q)'; print q % repr(q) [/code]
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Sonntag 17. Februar 2008, 21:50

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
BlackJack

Sonntag 17. Februar 2008, 23:38

@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.

Code: Alles auswählen

In [352]: int('D1', 16) & ((1 << 6) - 1)
Out[352]: 17
Schnäik
User
Beiträge: 10
Registriert: Freitag 8. Februar 2008, 17:27

Montag 18. Februar 2008, 01:24

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
Sag das doch gleich :D Danke für die Info!

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.
BlackJack

Montag 18. Februar 2008, 09:59

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.
Schnäik
User
Beiträge: 10
Registriert: Freitag 8. Februar 2008, 17:27

Montag 18. Februar 2008, 12:09

BlackJack hat geschrieben:Wenn es immer nur die untersten 6 Bit sind, reicht übrigens der letzte Buchstabe eines Hex-Wertes aus.
Wie meinen? Dann betrachte ich doch nur nur 4Bit?
BlackJack

Montag 18. Februar 2008, 12:47

Ups :oops: ich sollte keine Beiträge vor dem ersten Kaffee schreiben. :-)
Antworten