Code-Interpretation

OP #2708764
Lesenswert?

Hallo,

ich versuche mich gerade in ein Programmcode einzuarbeiten. Ich habe 
aber ein paar allgemeine Verständnisprobleme.
1
void canMsgToTSRResult(const CCanMessage* canMsg, CTSRResultEMP2* sign)
2
{
3
  const unsigned char* msgData = canMsg->MsgData;
4

5
  sign->SpeedLimitSign_kmh    = (int) msgData[0];
6
  sign->SupplementarySignType    = ((int) msgData[1])>>4;
7
  sign->NonSpeedLimitSignType    = (((int) msgData[1]) >> 0) & 0x0F;
8
  sign->SignVisionOnlyDecision  = (((int) msgData[6]) >> 5) & 0x03;
9
  sign->SignLaneAssignment    = (((int) msgData[6]) >> 3) & 0x03;
10
  sign->bElectronicSign      = (((int) msgData[6]) >> 2) & 0x01 ? 1 : 0;
11
  sign->Filter          = (((int) msgData[7]) >> 4) & 0x0F;
12
  sign->DistanceToSign_m    = (((int) msgData[7]) >> 0) & 0x0F;
13
  sign->DistanceToSign_m    <<= 2; // unit: 4m
14

15
  if( 0 == sign->SpeedLimitSign_kmh ) 
16
  {
17
    sign->NonSpeedLimitSignType = SPEED_LIMIT_END;
18
  }
19
}

Z.B. folgende Zeile
1
   sign->NonSpeedLimitSignType    = (((int) msgData[1]) >> 0) & 0x0F;
Warum verschiebe ich etwas um 0 Stellen und warum verknüpfe ich es dann 
mit 0x0F?? Wenn ich etwas mit UND verknüpfe und F, dann bleibt doch 
alles erhalten wie es war oder nicht? Und wenn ich es mit 0 verknüpfe 
lösche ich die Bits. Aber warum sollte ich die an dieser Stelle löschen?

Vielen Dank Leute!
#2708767
Lesenswert?

Typischer Code, um Bitfelder aus Bytes zu extrahieren. Das >>0 ist 
tatsächlich überflüssig, aber aus Konsistenzgründen nicht verkehrt, da 
merkt man eben gleich die Startposition. Das &0x0f filtert einfach die 
oberen 4 Bits aus, wenn einen nur die unteren 4 interessieren. Die 
oberen 4 Bit werden ja eine Zeile vorher extrahiert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren