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:

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.

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.