Binär Slicing

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
seum90
User
Beiträge: 13
Registriert: Mittwoch 11. November 2020, 08:47

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.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

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
seum90
User
Beiträge: 13
Registriert: Mittwoch 11. November 2020, 08:47

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 :)
seum90
User
Beiträge: 13
Registriert: Mittwoch 11. November 2020, 08:47

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:

Code: Alles auswählen

cal_status = bus.read_byte_data(address, _cal_status)
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.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
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:

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
seum90
User
Beiträge: 13
Registriert: Mittwoch 11. November 2020, 08:47

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.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
seum90
User
Beiträge: 13
Registriert: Mittwoch 11. November 2020, 08:47

Hallo, jetzt muss ich aber nochmal dumm fragen. Was macht die 3?
Benutzeravatar
__blackjack__
User
Beiträge: 14054
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
Antworten