Lastbits Bestimmung
-
Servus,
Ich versuche gerade diese funktion zu verstehen. Ich würde gerne verstehen was die Funktion macht und selbstverständlich wie sie es macht... Kann mir bitte jemand hier helfen... ICh weiß nur das es hier um einen streaming handelt...Ich wäre wirklich unendlich dankbar...
unsigned LastBits(unsigned n)
{
return n > 8 ? 0 : ((BYTE_ << (8-n)) & 0xff) >> (8-n);
}Dabei ist BYTE= BUF_[POS_++]
Danke im Voraus,
Dan
-
Bitte [cpp]-Tags verwenden, das sieht dann so aus:
unsigned LastBits(unsigned n) { return n > 8 ? 0 : ((BYTE_ << (8-n)) & 0xff) >> (8-n); }Also den tertiären Bedingungsoperator
operator:?kennst du hoffentlich. Wennngrösser als 8 ist, wird 0 zurückgegeben, ansonsten der Ausdruck hinter dem Doppelpunkt.BYTE_ << (8-n)ist ein Linksshift. Das Bitmuster wird nach links verschoben, und zwar um(8-n)Stellen. Die neu entstehenden Bits werden mit 0 aufgefüllt. Praktisch kommt das einer Multiplikation mit 2 gleich.operator>>, also der Rechtsshift-Operator macht das Gegenteil, verschiebt also das Bitmuster nach rechts und schneidet dabei die letzten Bits ab. Das entspricht einer Integerdivision durch 2 (abgerundet).operator&ist die bitweise AND-Verknüpfung. Diese schaut für jedes Bit der zwei Operanden, ob beide 1 sind, und gibt nur dann 1 zurück.Mit diesem Wissen solltest du den Ausdruck eigentlich entziffern können, ansonsten informier dich noch etwas genauer über Bit-Operationen.
-
Daniel A schrieb:
unsigned LastBits(unsigned n) { return n > 8 ? 0 : ((BYTE_ << (8-n)) & 0xff) >> (8-n); }gehen wir einfach mal der reihe nach - ich schreibs erst mal ein wenig ausführlicher ^^
unsigned int LastBits(unsigned int value_in) { if (n > 8)/*Bitwerte = ... 8 4 2 1*/ { //das heißt also, dass mind. das 5.bit (von hinten) belegt ist - in diesem fall gibt er 0 zurück return 0; } else { unsigned int tmp1 = BYTE_ << (8-n); //byte wird um 8-n positionen (bits) nach links geshiftet unsigned int tmp2 = tmp1 & 0xff; /*und mit dem and fallen alle stellen weg - außer die letzten 8 ... xxxx xxxx xxxx & 1111 1111 == ... xxxx xxxx xxxx & 0000 .... 0000 1111 1111 ==> 0000 .... 0000 xxxx xxxx ===> xxxx xxxx*/ unsigned int tmp3 = tmp2 >> (8-n); //und wir shiften wieder (8-n) bit nach rechts return tmp3; } }gib vll mal den zusammenhang mit dazu.. ansonsten musst du auf nen kompetenteren warten

bb
-
Vielen vielen Dank für die Antworten und vor allem für die ausführliche Antwort unskilled... Dadurch könnte ich die Problematik besser verstehen...
Dan