Seite 1 von 1

Von HEX über Binär zu Dezimal

Verfasst: Sonntag 17. Februar 2008, 20:31
von Schnäik
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!

Verfasst: Sonntag 17. Februar 2008, 20:39
von DarXun
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 >.<

Verfasst: Sonntag 17. Februar 2008, 21:22
von Schnäik
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.

Verfasst: Sonntag 17. Februar 2008, 21:35
von Craven
Du könntest dir die Umrechnung mit C oder C++ als Modul schreiben.

Hier noch ein Link zum Thema: Zahlensysteme.

Verfasst: Sonntag 17. Februar 2008, 21:50
von veers

Code: Alles auswählen

In [2]: hex(666)
Out[2]: '0x29a'

In [6]: int("0x29a", 16)
Out[6]: 666

Verfasst: Sonntag 17. Februar 2008, 23:38
von BlackJack
@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

Verfasst: Montag 18. Februar 2008, 01:24
von Schnäik
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?

Verfasst: Montag 18. Februar 2008, 09:59
von BlackJack
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.

Verfasst: Montag 18. Februar 2008, 12:09
von Schnäik
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?

Verfasst: Montag 18. Februar 2008, 12:47
von BlackJack
Ups :oops: ich sollte keine Beiträge vor dem ersten Kaffee schreiben. :-)