Seite 1 von 1
Binär Slicing
Verfasst: Dienstag 16. März 2021, 11:13
von seum90
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.
Re: Binär Slicing
Verfasst: Dienstag 16. März 2021, 11:18
von Sirius3
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
Re: Binär Slicing
Verfasst: Dienstag 16. März 2021, 11:52
von seum90
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

Re: Binär Slicing
Verfasst: Dienstag 16. März 2021, 13:10
von seum90
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.
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)
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.
Re: Binär Slicing
Verfasst: Dienstag 16. März 2021, 13:32
von __blackjack__
@seum90: Der `bin()`-Aufruf ist falsch. Du willst mit der Zahl arbeiten, nicht mit einer Zeichenkettendarstellung davon.
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)
Re: Binär Slicing
Verfasst: Dienstag 16. März 2021, 14:17
von seum90
Danke für die Antwort,
mit & 0b11 geht es. Aber was hat es damit auf sich? Ich finde dazu nichts? Habe auch schon 0x03 gesehen oder wie oben nur 3.
Re: Binär Slicing
Verfasst: Dienstag 16. März 2021, 14:23
von Sirius3
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.
Re: Binär Slicing
Verfasst: Dienstag 16. März 2021, 14:49
von seum90
Hallo, jetzt muss ich aber nochmal dumm fragen. Was macht die 3?
Re: Binär Slicing
Verfasst: Dienstag 16. März 2021, 14:55
von __blackjack__
@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.