dec to bin optimierung?

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.
cyp++
User
Beiträge: 69
Registriert: Freitag 22. September 2006, 13:54

dec to bin optimierung?

Beitragvon cyp++ » Montag 25. Februar 2008, 10:53

Hallo Community,

in Rahmen eines Steganographie Projekts, muss ich Farben - welche in dezimaler Form vorhanden sind - in binär umwandeln. Dafür habe ich mir eine Funktion geschrieben, die allerdings auf eine andere (selbstgeschriebene) Funktion zugreift, ob das so pythonic und optimal ist wage ich zu bezweifeln, also stelle ich mal meinen Code hier rein und bitte um Hilfe meinen Code zu o ptimieren und pythonisieren :D

Code: Alles auswählen

def zeroise_bin(numbr):
    tmp = ''
    tmp = tmp.join(numbr*['0'])
    return tmp

def dec_to_bin(value):
    tmp = ''
    bin = []
    while (value!=0):
        if value%2==0:
            value /= 2
            bin += '0'
        if value%2==1:
            value /= 2
            bin += '1'

    places = zeroise_bin(8-len(bin))
    tmp = places + tmp.join(bin)

    return tmp

print dec_to_bin(ord('A'))



Hautsächlich geht es mir um das Nullen auffüllen, damit ich auf 8 Bits komme, da ich alle benötige.

MfG
BlackJack

Beitragvon BlackJack » Montag 25. Februar 2008, 11:20

Meine übliche Bemerkung: Das heisst `int_to_bin()` weil die Funktion ganze Zahlen erwartet und keine "Dezimalzahlen".

`number` mit `numbr` ab zu kürzen ist ja wohl'n Scherz. Wobei diese überaus komplizierte Funktion scheinbar nichts anderes macht als ``'0' * number``. Das muss man nun wirklich nicht in eine Funktion auslagern.

In beiden Funktionen ist die Zeile ``tmp = ''`` überlüssig.

In beiden ``if``-Zweigen wird ``value`` durch zwei geteilt, dass heisst das kann man aus der Schleife heraus ziehen und muss es nur einmal hin schreiben.

Wenn auf eine ``if``-Abfrage eine zweite folgt, die genau das Gegenteil der ersten behandelt, kann man sich den Test sparen und einfach ein ``else`` nehmen.

Allerdings kannst Du Dir auch mal anschauen was jeweils beim Test heraus kommt und was darauf hin an `bin` angehängt wird. Da braucht man gar keine ``if``-Abfrage für.

Für's auffüllen mit 0en gibt's auf Zeichenketten die `zfill()`-Methode.

Ausserdem sollte man vor dem Optimieren erst einmal dafür sorgen, dass die Funktion korrekt ist! Teste Deine mal, da kommen falsche Ergebnisse heraus.

Code: Alles auswählen

def int2bin(value):
    result = list()
    while value:
        result.append(str(value & 1))
        value >>= 1
    result.reverse()
    return ''.join(result).zfill(8)
cyp++
User
Beiträge: 69
Registriert: Freitag 22. September 2006, 13:54

Beitragvon cyp++ » Montag 25. Februar 2008, 11:28

Meine übliche Bemerkung: Das heisst `int_to_bin()` weil die Funktion ganze Zahlen erwartet und keine "Dezimalzahlen".

Hatte ich zuerst auch stehen, aber dann dachte ich mir es wären dezimalzahlen. Aber okay, nun weiß ich bescheid.


`number` mit `numbr` ab zu kürzen ist ja wohl'n Scherz. Wobei diese überaus komplizierte Funktion scheinbar nichts anderes macht als ``'0' * number``. Das muss man nun wirklich nicht in eine Funktion auslagern.

Stimmt, die Abkürzung ist echt lächerlich ;-) Und zu der Auslagerung in eine Funktion: Ich dachte es sähe übersichtlicher aus!


Ausserdem sollte man vor dem Optimieren erst einmal dafür sorgen, dass die Funktion korrekt ist! Teste Deine mal, da kommen falsche Ergebnisse heraus.


Da stimmt ich nicht mit dir überein! Bei mir kommt das richtige Ergebnis raus! z.b. 15 -> 00001111
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Beitragvon Zap » Montag 25. Februar 2008, 11:35

cyp++ hat geschrieben:Da stimmt ich nicht mit dir überein! Bei mir kommt das richtige Ergebnis raus! z.b. 15 -> 00001111


Da hast du nen glücklichen Treffer gelandet.
Schau mal hier:

Code: Alles auswählen

In [14]: dec_to_bin(2)
Out[14]: '00000001'

In [15]: dec_to_bin(4)
Out[15]: '00000001'
cyp++
User
Beiträge: 69
Registriert: Freitag 22. September 2006, 13:54

Beitragvon cyp++ » Mittwoch 27. Februar 2008, 16:44

Code: Alles auswählen

while value:
        result.append(str(value & 1))
        value >>= 1


Das verstehe ich noch nicht so ganz. Value & 1? value >>= 1?

Ich bitte um Erklärung.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Mittwoch 27. Februar 2008, 16:50

Binäroperatoren, Bitschubserei.

>> ist der Operator für Shift
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Mittwoch 27. Februar 2008, 17:27

BlackJack hat geschrieben:Meine übliche Bemerkung: Das heisst `int_to_bin()` weil die Funktion ganze Zahlen erwartet und keine "Dezimalzahlen".


Das sehe ich anders.
Was hier umgewandelt wird sind natürliche Zahlen im Dezimalsystem in entsprechende Dualzahlen. Die Menge der ganzen Zahlen umfasst auch negative Zahlen, um die geht es ja nicht. Da es hier um Umwandlungen zwischen Zahlensystemen geht, ist dec oder dez m.E. genau richtig, weil es die Basis benennt - ebenso wie bin.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 27. Februar 2008, 17:35

pütone hat geschrieben:Das sehe ich anders.
Was hier umgewandelt wird sind natürliche Zahlen im Dezimalsystem in entsprechende Dualzahlen.

Nein, da werden Ganzzahlen in Dualzahlen konvertiert. Du kannst der Funktion auch Oktalzahlen oder Hexadezimalzahlen geben, die werden alle vom Python-Interpreter identisch behandelt, weil sie alle Integer sind.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Mittwoch 27. Februar 2008, 17:38

Aber man kann eben auch Oktalzahlen oder Hexazahlen umwandeln.
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Mittwoch 27. Februar 2008, 17:44

pütone hat geschrieben:Was hier umgewandelt wird sind natürliche Zahlen im Dezimalsystem in entsprechende Dualzahlen. Die Menge der ganzen Zahlen umfasst auch negative Zahlen, um die geht es ja nicht. Da es hier um Umwandlungen zwischen Zahlensystemen geht, ist dec oder dez m.E. genau richtig, weil es die Basis benennt - ebenso wie bin.


Der Unterschied ist, dass du einen Wert in die Funktion hineingibst und eine Repräsentation dieses Wertes in einem bestimmten Format (dual, ternär, dezimal, ...) zurückbekommst.

Das Eingabeformat, typischerweise dezimal, ist dabei vollkommen uninteressant.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Mittwoch 27. Februar 2008, 18:50

Ich bin von dem ausgegangen, was das Ausgangsprogramm leisten soll.
Da geht es um dezimale Farbwerte, die in Dualzahlen umgewandelt werden. Und in diesem Zusammenhang ist dez oder dec m.E. die bessere Wahl für die Bezeichnung, weil es das beschreibt, was die Funktion IN DIESEM PROGRAMM macht: nämliche Dezimalzahlen in Binär-/Dualzahlen umzuwandeln.
BlackJack

Beitragvon BlackJack » Mittwoch 27. Februar 2008, 19:07

Die Funktion wandelt Zahlen in Binärdarstellung um. Das die vorher mal irgendwann in Dezimaldarstellung vorhanden waren spielt keine Rolle. Eine Funktion `dec_to_int()` sollte, wenn der Name passen soll, auch Zahlen in Dezimaldarstellung entgegennehmen, also Objekte vom Typ `str` oder `unicode` und keine `int` oder `long`. Tut diese Funktion aber nicht.
cyp++
User
Beiträge: 69
Registriert: Freitag 22. September 2006, 13:54

Beitragvon cyp++ » Mittwoch 27. Februar 2008, 19:38

audax hat geschrieben:Binäroperatoren, Bitschubserei.

>> ist der Operator für Shift


Okay, den Operator hab ich jetzt verstanden!

Doch was ist mit

Code: Alles auswählen

value & 1
?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Mittwoch 27. Februar 2008, 19:44

Ein binäres 'und'

1001 & 1 -> 1
1001 & 10 -> 0
1111 & 1100 -> 1100

http://docs.python.org/ref/binary.html

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder