Ankündigung

Einklappen
Keine Ankündigung bisher.

Makro zum Extrahieren einzelner Bits aus einem 2-Byte Wert

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Codebeispiel] Makro zum Extrahieren einzelner Bits aus einem 2-Byte Wert

    Hat da jemand evtl. schon was fertiges in der Tasche?

    Ich möchte aus einem 2-Byte Wert jedes Bit einzeln als eigenen Wert extrahieren.
    Entweder mit XOR oder mit SHIFT sollte das gut machbar sein, aber man muss das Rad ja nicht neu erfinden, wenn es schon was gibt.

    Danke
    Uwe
    ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

    #2
    Wie genau extrahieren in eine 1 - Bit Variable?
    Z.B. mit Bit 3 (gezählt ab Bit 0) : 2^3 = 8
    Code:
    MyBit_3= ("GA16Bit-1/2/3" and 0x8u16) == 0x8u16
    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
    Enertex Produkte kaufen

    Kommentar


      #3
      so einfach dachte ich zuerst auch, hat aber (letzte Woche) nicht wirklich funktioniert. Kann Dir jetzt aber nicht mehr sagen, was das Problem war. (im Zweifelsfall das zwischen Tastatur und Bildschirm...)

      Und ich wollte das noch als Funktion verpacken a la bit(Wert, Position)

      ohne sich um Variablentypen etc. groß Gedanken machen zu müssen. Aber auch das sollte mit Deiner Lösung ja eigentlich gehen. Halt dann mit "2^Position".

      Ich teste noch mal....
      ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

      Kommentar


        #4
        Code:
        : begin bit(Wert, Position)
        
        :var w@
        // wenn du bei Wert alles x-beliebige reinwerfen willst, nach u16 wandeln
        w@ = convert(Wert, 0u16)
        :var result@
        
        result@ = shift(wert@,15u08-Position) > 32767u16
        :return result@
        :end
        Sollte ungefähr so hinhauen. Prinzip: Das gesuchte Bit auf das höchstwertige Bit linksschieben und schauen ob größer 2^15 - 1. Wenn ja war das Bit gesetzt, sonst nicht. Sitz gerade nicht vorm PC und hab das nur kurz so eingetippt, deshalb noch nicht getestet, aber vielleicht machst Du das ja...

        Natürlich ist das 'and' von enertegus eleganter und die bessere Lösung!
        Zuletzt geändert von klaus_kraemer; 20.06.2018, 19:25.

        Kommentar


          #5
          Hab auf Michaels Basis schon ein kleines Makro gemacht, das grundsätzlich funktioniert. Da ich es aber universell haben will ist das ne recht wilde convert-Orgie, daher bin ich noch nicht so richtig zufrieden.
          ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

          Kommentar


            #6
            Was meinst Du denn mit Universell?
            offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
            Enertex Produkte kaufen

            Kommentar


              #7
              ohne mir Gedanken über den Datentyp machen zu müssen, mit dem ich die Funktion füttere.
              ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

              Kommentar


                #8
                Ja aber man wird ja wohl nur Ganzzahltypen haben oder?
                offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                Enertex Produkte kaufen

                Kommentar


                  #9
                  Ja, aber da kann’s ja auch U8, 16, 32 sein und das Ergebnis soll b01 sein. Und die Pow() Funktion akzeptiert nur float.

                  PS:
                  ich hab damals bei Einführung schon gesagt, dass die ganze Konvertierung automatisch funktionieren sollte. Das würde vieles deutlich leichter und übersichtlicher machen. Meine Meinung.
                  vielleicht für die 5.0
                  Zuletzt geändert von Uwe!; 21.06.2018, 18:57.
                  ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                  Kommentar


                    #10
                    Wenn Du in das Makro mit einem Ganzzahlwert reingehst, wie in meinem Beispiel? Ich habs hier nur auf die elegantere Weise von enertegus geändert:

                    Code:
                    :begin bit(Wert, Position)
                    
                    // wenn du bei Wert alles x-beliebige reinwerfen willst, gleich nach u32 wandeln:
                    //Wertebereich Position: 0..31
                    
                    :var w@
                    w@ = convert(Wert, 0u32)
                    
                    :var result@
                    
                    result@ = (w@ and shift(1u32, Position)) > 0u32
                    
                    :return result@
                    :end
                    Also ich finde, das ist keine convert-Orgie - einmal muss halt sein.

                    Kommentar


                      #11
                      Zitat von Uwe! Beitrag anzeigen
                      PS:
                      ich hab damals bei Einführung schon gesagt, dass die ganze Konvertierung automatisch funktionieren sollte. Das würde vieles deutlich leichter und übersichtlicher machen. Meine Meinung.
                      vielleicht für die 5.0
                      Mir würde schon reichen, die Notation einer Typwandlung zu vereinfachen anstatt convert(wert, 0u32) etwas wie "wert#u32".

                      Ein schönes Negativbeispiel ist das Rechnen mit 0u08 Variablen, um keine Überläufe zu erzeugen:

                      Code:
                      prozent = 0u08
                      
                      .......
                      
                      if change(xy) then {
                          prozent = convert(convert(xy,0u16) * 100u16 / convert(maxwert,0u16), 0u08);
                      } endif
                      wäre dann neu z.B.

                      Code:
                      prozent = 0u08
                      
                      .......
                      
                      if change(xy) then {
                          prozent = (xy#u16 * 100u16 / maxwert#u16)#u08;
                      } endif
                      Würde sich leichter schreiben, das Problem, die Übersicht bei der Klammerung zu verlieren würde sich minimieren und ein Parser sollte das ebenso gut erkennen können. Mir ist es lieber, ich mache die Konversion bewusst, als dass hier Automatismen greifen, die ich vielleicht nicht mehr richtig beeinflussen kann.

                      Kommentar


                        #12
                        Zitat von Uwe! Beitrag anzeigen
                        ich hab damals bei Einführung schon gesagt, dass die ganze Konvertierung automatisch funktionieren sollte. Das würde vieles deutlich leichter und übersichtlicher machen.
                        Nein, das macht das alles nur noch schwerer, weil man dann unendlich viele Probleme bekommen kann. Ob das was für die 5.0 wird, weiss ich nicht.
                        Letztlich gibt es ja die Convert-Funktion, so dass es auch - wenn beabsichtigt - einfach geht.
                        offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                        Enertex Produkte kaufen

                        Kommentar


                          #13
                          Zitat von klaus_kraemer Beitrag anzeigen
                          Mir ist es lieber, ich mache die Konversion bewusst, als dass hier Automatismen greifen, die ich vielleicht nicht mehr richtig beeinflussen kann.
                          so unterschiedlich sind die Wünsch! Und Michael muss es ausbaden ;-)

                          Mein Beispiel wäre einfach
                          Code:
                           
                           if change(xy) then {     prozent = xy * 100 / maxwert; } endif
                          wann will ich den sowas tatsächlich in u08 rechnen? Das macht doch keinen Sinn.
                          ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                          Kommentar


                            #14
                            Zitat von klaus_kraemer Beitrag anzeigen
                            Also ich finde, das ist keine convert-Orgie - einmal muss halt sein.
                            Nein, das ist wirklich schlank. Nutzt aber eben auch shift()
                            Ich hab's erst mal mit Michales Vorschlag versucht. Da ist dann aber eben auch noch f32 (wegen pow) und b01 (weil das Ergebnis von and u32 bleibt) mit im Spiel.

                            Sieht dann aktuell bei mir so aus:

                            Code:
                            :info Extrahiert aus "Wert" das Bit an Stelle "BitPos"
                            :var BitWert@
                            :var Err@
                            BitWert@ = AUS
                            Err@ = EIN
                            if convert(Wert, 0s32) < 0s32 then BitWert@ = 0b01 ; Err@ = 1b01 endif
                            if convert(Wert, 0s32) >= 0s32 then BitWert@ = (convert("Überwachung-Status-Sensorik-8/6/93", 0u32) and convert(pow(2f32, convert(BitPos, 0f32)), 0u32))  ==  convert(pow(2f32, convert(BitPos, 0f32)), 0u32) ; Err@ = 0b01 endif
                            
                            :return BitWert@ ; Err@
                            :end
                            seh grad, dass da die GA vom Test noch fest drin ist, bitte ignorieren .
                            Zuletzt geändert von Uwe!; 22.06.2018, 11:02.
                            ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                            Kommentar


                              #15
                              Zitat von Uwe! Beitrag anzeigen
                              ...
                              wann will ich den sowas tatsächlich in u08 rechnen? Das macht doch keinen Sinn.
                              Wenn 100% wie so oft auf 1 Byte abgebildet werden...

                              enertegus

                              Was spräche denn dagegen, eine Kurznotation (ähnlich wie oben beschrieben) für die Typkonvertierung anzubieten?

                              Kommentar

                              Lädt...
                              X