Bits aus einem uint16_t auslesen



  • Hallo,

    ich habe eine Anwendung das mir ein String Wert liefert, welches ein Integer Wert representiert. Dies wandle ich dann mit atoi in ein Integer Wert um. Der Integer Wert ist folgendermassen aufgebaut:

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      00|S|Z|   Scale   |   Multiplier  |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    

    Meine Frage ist nun wie bekomme ich den Scale und Multiplier Wert? Mit dem folgenden Code bin ich mir nicht so sicher ob ich wirklich diese Werte bekomme.

    ...
    uint16_t errest,scale,multiplier;
    
    errest = atoi(strvalue);
    errest << 2; //verschieben der letzten 2 Bits
    scale = errest << 6;
    multiplier = errest << 8;
    ...
    

    Ist das so richtig?

    Danke + Gruss,
    Haksi



  • So:

    multiplier = errest & 0xFF;
    scale = (errest >> 8) & 0x3F;
    


  • haksi74 schrieb:

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      00|S|Z|   Scale   |   Multiplier  |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    

    steckt der 'multiplier' in den bits 9...15, oder hast du die die zahlen oben vertauscht?
    🙂



  • Nein. Das habe ich so aus einer RFC. Die Zahlen geben nicht die Reihenfolge an. Sie stellen nur die Belegung der Bits dar. Auf Linux soll der 15 Bit ganz links stehen so hat man folgende Belegung.
    S = Bit 15
    Z = Bit 14
    Scale = Bit 13 - 8
    Multiplier = 7 - 0

    Gruss,
    Haksi


Anmelden zum Antworten