Hallo in die Runde!
Ich habe gerade ein Problem und komme einfach nicht auf die Lösung.
ich habe einen Wert in 8 bit binär (0b00011011). Diesen möchte ich slicen.
b = 0b00011011
b1 = b[2:4]
b2 = b[4:6]
b3 = b[6:8]
b4 = b[8:10]
als String funktioniert das Ganze auch, aber ich muss diese 2 bit´s jeweils dann wieder dezimal ausgeben (0, 1, 2, 3).
Und genau hier finde ich keinen Lösungsansatz, da ich aus einem String kein binär mehr machen kann.
Ich hoffe ich konnte mein Problem richtig beschreiben.
Danke schonmal für die Hilfe.
Binär Slicing
Dafür benutzt man Bit-Operationen:
Code: Alles auswählen
b1 = (b>>6) & 3
b2 = (b>>4) & 3
b3 = (b>>2) & 3
b4 = (b>>0) & 3
Hallo,
vielen Dank für deine schnelle Hilfe. Das habe ich heute auch schonmal versucht, aber das hat nicht geklappt weil ich das "0B" vergessen habe. Da wurde aus meinem INT wieder ein str. Aber jetzt Funktioniert es
Vielen Dank.
Was ich aber noch nicht ganz verstanden hab, für was ist das & 3?
Edit:
Jetz war ich wohl doch etwas voreilig. Das ganze funktioniert doch noch nicht wie gewünscht. Ich muss mir das nochmal anschauen und dann melde ich mich nochmal
vielen Dank für deine schnelle Hilfe. Das habe ich heute auch schonmal versucht, aber das hat nicht geklappt weil ich das "0B" vergessen habe. Da wurde aus meinem INT wieder ein str. Aber jetzt Funktioniert es

Was ich aber noch nicht ganz verstanden hab, für was ist das & 3?
Edit:
Jetz war ich wohl doch etwas voreilig. Das ganze funktioniert doch noch nicht wie gewünscht. Ich muss mir das nochmal anschauen und dann melde ich mich nochmal

Also es funktioniert nicht.
Hier noch mehr Background:
Ich lese die Werte aus einem BNO055 Sensor mit i2c.
Als LIB verwendeich smbus.
Ich hole mir die daten mit:
der Wert kommt als int rein und ich mache mit cal_status = bin(cal_status) wohl einen String daraus.
Jetzt funktionieren die Bit Operatoren natürlich nicht
Der Dualwert den ich mit print(bin(cal_status)) angezeigt bekomme (0b10110010) ist der richtige. Das ist der Status aus dem Register.
Hier erhalte ich folgende Fehlermeldung:
Traceback (most recent call last):
File "/home/pi/neigung.py", line 30, in <module>
bin_bin_cal_status = bin(bin_cal_status)
TypeError: 'str' object cannot be interpreted as an integer
Vielen Danke für eure Bemühungen.
Hier noch mehr Background:
Ich lese die Werte aus einem BNO055 Sensor mit i2c.
Als LIB verwendeich smbus.
Ich hole mir die daten mit:
Code: Alles auswählen
cal_status = bus.read_byte_data(address, _cal_status)
Jetzt funktionieren die Bit Operatoren natürlich nicht
Der Dualwert den ich mit print(bin(cal_status)) angezeigt bekomme (0b10110010) ist der richtige. Das ist der Status aus dem Register.
Code: Alles auswählen
bin_cal_status = bin(cal_status)
sys_status = (bin_cal_status>>6) & 3
gyr_status = (bin_cal_status>>4) & 3
acc_status = (bin_cal_status>>2) & 3
mag_status = (bin_cal_status>>0) & 3
print(sys_status, gyr_status, acc_status, mag_status)
Traceback (most recent call last):
File "/home/pi/neigung.py", line 30, in <module>
bin_bin_cal_status = bin(bin_cal_status)
TypeError: 'str' object cannot be interpreted as an integer
Vielen Danke für eure Bemühungen.
- __blackjack__
- User
- Beiträge: 14055
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@seum90: Der `bin()`-Aufruf ist falsch. Du willst mit der Zahl arbeiten, nicht mit einer Zeichenkettendarstellung davon.
Edit:
Edit:
Code: Alles auswählen
sys_status = (cal_status >> 6) & 0b11
gyr_status = (cal_status >> 4) & 0b11
acc_status = (cal_status >> 2) & 0b11
mag_status = (cal_status >> 0) & 0b11
print(sys_status, gyr_status, acc_status, mag_status)
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Das ist alles das selbe 3 == 0b11 == 0x03, einfach nur andere Zahlensysteme (dezimal, binär, hexadezimal). Dein Problem war, dass Du mit bin(...) eine Zeichenkette erzeugt hast, womit man natürlich nicht rechnen kann.
- __blackjack__
- User
- Beiträge: 14055
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@seum90: Die 3 alleine macht gar nichts. Zusammen mit der bitweisen und-Verknüpfung passiert etwas. Mach Dir mal klar was diese Verknüpfung mit den Bits macht die im zweiten Operanden 0 sind. Dann wird Dir vielleicht auch klar warum ich den Wert als Binärzahl angegeben habe. Für den Rechner macht 3 vs. 0b11 keinen Unterschied. Aber der menschliche Leser versteht das dann oft besser wenn er die Bits sieht und nicht den Dezimalwert. Noch deutlicher wird es wenn man alle acht Bits angibt, also 0b0000_0011.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari