Dezimale Zahl (0-255) zu 8 booleschen Werten

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
senden9
User
Beiträge: 11
Registriert: Montag 23. Januar 2012, 11:36

Hallo.
ich ich lasse einen Mikrocontroller mit einem Server mit Django kommunizieren. Der Mikrocontroller sendet mir eine Zahl zwischen 0 - 255 zurück. Diese Zahl stellt 8 Eingänge dar.
Z.B ist 12 => Eingang 1 High / Eingang 2 High / Eingang 3 Low / Eingang 4 Low / Eingang 5 Low / Eingang 6 Low / Eingang 7 Low / Eingang 8 Low. Also in binärer Schreibweise. Wie finde ich in Python heraus welcher Pin High/Low ist? Ich möchte also eine dezimale Zahl zu 8 booleschen Werten umwandeln.

MfG
senden9
deets

Code: Alles auswählen


portwert = 8
stelle = 3 # 0-7
if (1 << stelle) & portwert:
    print "stelle ", stelle, " gesetzt"

Mit nem huebschen Schleifchen drum rum kannst du das ganze natuerlich auch zu einer Liste von 0/1 machen.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@senden9:
Wenn
senden9 hat geschrieben:Z.B ist 12 => Eingang 1 High / Eingang 2 High / Eingang 3 Low / Eingang 4 Low / Eingang 5 Low / Eingang 6 Low / Eingang 7 Low / Eingang 8 Low
das stimmt, sind allerdings die Eingänge vertauscht und Du müsstest das zusätzlich behandeln.
senden9
User
Beiträge: 11
Registriert: Montag 23. Januar 2012, 11:36

jerch hat geschrieben:@senden9:
Wenn
senden9 hat geschrieben:Z.B ist 12 => Eingang 1 High / Eingang 2 High / Eingang 3 Low / Eingang 4 Low / Eingang 5 Low / Eingang 6 Low / Eingang 7 Low / Eingang 8 Low
das stimmt, sind allerdings die Eingänge vertauscht und Du müsstest das zusätzlich behandeln.
Sorry das war ein Denkfehler und stimmt so nicht. Die Reihenfolge ist anders.

Der obrige Code funktioniert übrigens hervorragend. Danke!
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

senden9 hat geschrieben: Sorry das war ein Denkfehler und stimmt so nicht. Die Reihenfolge ist anders.
Und ich wundere mich, dass die Ergebnisse nicht passen. Sowas liebe ich ja… :evil:
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Wenn Du eh immer mit der Liste der Eingänge arbeitest, kannst Du das nutzen:

Code: Alles auswählen

>>> def int_to_bitlist(num, bits):
...   return [num>>n & 1 for n in xrange(bits)][::-1]
... 
>>> int_to_bitlist(12, 8)
[0, 0, 0, 0, 1, 1, 0, 0]
bzw. ohne [::-1], dann steht `int_to_bitlist(12, 8 )[n-1]` für das n-te Bit. Das [::-1] hab ich nur eingefügt, da wir höherwertige Stellen bei der Ausgabe normalerweise links vermuten ;)
Lenzer
User
Beiträge: 9
Registriert: Dienstag 13. Dezember 2011, 04:20

Danke für die interessanten Beiträge :) Habe ich mich selber auch mal gefragt..
senden9
User
Beiträge: 11
Registriert: Montag 23. Januar 2012, 11:36

Danke. ich hab mich jetzt für eine leicht abgewandelte vorm von jerch entschieden.
PS: Muss ich in diesem Forum irgendwo auf "Gelöst" oder so was drücken?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

senden9 hat geschrieben:PS: Muss ich in diesem Forum irgendwo auf "Gelöst" oder so was drücken?
Nein. Spätestens wenn jemand einen Bug fände, der Freitags nachts um 23:42 bei Neumond unter Umständen Schwierigkeiten mit dem Code machen könnte wenn die Quadratwurzel des Unix-Sekundenzählers eine Primzahl ist, dann würde alsbald ein Geschrei anheben, dass das "Gelöst"-Flag weg muss. Deshalb führen wir das hier erst gar nicht ein.
Antworten