Verständnisfrage bei einer mathematischen Operation
-
Hallo! Ich währe euch sehr Dankbar, wenn ihr mir bei folgender Aufgabenstellung helfen könntet:
Sie erhalten aus einer Datenübertragung einen Rückgabewert vom Typ unsigned short. In diesem Wert ist sowohl die Nummer des aussendenden Sensors als auch der eigentliche Messwert enthalten. Die Nummer des Sensors (1-15) befindet sich in den untersten 4 Bit (3..0), die restlichen 12 Bit sind der eigentliche Messwert.
Ausgabe soll folgendermaßen aussehen:
-Sensor Nummer:
-Messwert untere 4 Bit:
-Messwert mittlere 4 Bit:
-Messwert obere 4 Bit:Das C-Programm soll die Sensornummer erkennen und den eigentlichen Messwert (12Bit) unter Angabe seiner Sonsornummer ausgeben.
Die Datenübertragung soll hier simuliert werden, durch einlesen der Messwerte von der Tastatur in hexadezimaler Form und geeignet auf Plausibilität überprüft werden.
Nun habe ich dazu folgenden Code:
int main() { unsigned short Rueckgabewert; unsigned int SensorNr = 1; //int wegen ganze Zahlen unsigned int MwzH, MwzZ, MwzE; printf("Hallo, dieses Programm rechnet bzw. gibt fuer Sie die \nSensornummer, Hunderter-, Zehner- und Einerstelle eines Messwertes aus!\n\n"); do{ printf("Bitte geben Sie eine Hexaldezimalzahl ein: \n"); scanf ("%hx",&Rueckgabewert); SensorNr = Rueckgabewert / 4096; // Berechnung der Messwerte MwzH = Rueckgabewert / 256 - SensorNr * 16; MwzZ = Rueckgabewert / 16 - SensorNr * 256 - MwzH * 16; MwzE = Rueckgabewert - SensorNr * 4096 - MwzH * 256 - MwzZ * 16; if(SensorNr!=0){ //Die Ausgabe erfolgt nur wenn die Sensornummer NICHT "0" ist printf("Ihr Rueckgabewert ist %hu\n",Rueckgabewert); printf("\n"); printf("Sensornummer:\t\t\t\t%u\n", SensorNr); printf("MesswertHunderter (obere 4 Bit):\t%u\n", MwzH); printf("MesswertZehner (mittlere 4 Bit):\t%u\n", MwzZ); printf("MesswertEiner (untere 4 Bit):\t\t%u\n", MwzE); } else{ //Falls Sensornummer "0" ist, springt er sofort auf diesen Punkt printf("Die Sensornummer betraegt 0!\n"); } } while(SensorNr!=0); getch (); return 0; }
Leider verstehe ich den Mathematischen Algorithmus nicht. Weshalb teilt man den Wert durch 4096 und erhällt dann den Sensormesswert usw..?
SensorNr = Rueckgabewert / 4096; // Berechnung der Messwerte MwzH = Rueckgabewert / 256 - SensorNr * 16; MwzZ = Rueckgabewert / 16 - SensorNr * 256 - MwzH * 16; MwzE = Rueckgabewert - SensorNr * 4096 - MwzH * 256 - MwzZ * 16;
Über Hilfe und Ideen würde ich mich sehr freuen!
-
Wenn ich dir sage, dass die Rechnung tatsächlich falsch ist, sagst du dann eher "Klar. Bei dem Vorgehen ist die Reihenfolge genau falsch rum" oder eher "Ich habe keine Ahnung, was da überhaupt wie und warum abgeht"?
-
Das
SensorNr = Rueckgabewert / 4096; // Berechnung der Messwerte MwzH = Rueckgabewert / 256 - SensorNr * 16; MwzZ = Rueckgabewert / 16 - SensorNr * 256 - MwzH * 16; MwzE = Rueckgabewert - SensorNr * 4096 - MwzH * 256 - MwzZ * 16;
ist falsch und zu aufwendig. ( / 4096 ermittelt die höchsten Bits 12-15)
Besser geht es mit dem Modulooperator %
Oder mit den bitweisen Logikoperatoren | & || >> ~TheGrandCoder schrieb:
Leider verstehe ich den Mathematischen Algorithmus nicht.
Du kannst das ja mal mit Zahlen im Dezimalsystem durchspielen und dann versuchen umzudenken.
Wie bekommst du aus der Zahl 1234 die Einer-, Zehner, Hunderter- und Tausenderstelle raus?
-
TheGrandCoder schrieb:
Die Nummer des Sensors (1-15) befindet sich in den untersten 4 Bit (3..0), die restlichen 12 Bit sind der eigentliche Messwert.
...
Über Hilfe und Ideen würde ich mich sehr freuen!Ich würde es so machen:
SensorNum = x&15;
SensorVal = x>>4;x sind die Rohdaten vom Sensor. x&15 maskiert die Sensornumner aus (0...15), und x>>4 eliminiert die Sensornummer und schiebt den Wert an die richtige Position.
-
Super! Eure Hinweise waren sehr Hilfreich.
Da es eine mathematische operation sein soll habe ich es folgendermaßen gelöst:scanf("%hx",&Messwert); //Einlesen als Hexazahl printf("Der Ausgegebene Wert des Sensors: %hx\n",Messwert); //Berechnung der Sensornummer Sensornummer= Messwert/4096; printf("\nDie Sensornummer: %hu\n\n",Sensornummer); //Ermittlung des Messwerts if(Sensornummer!=0){ Messwert= Messwert%4096; //Messwert von Sensornummer trennen Ersten4Bits=Messwert/256; //Ersten Bits bestimmen Zweiten4Bits=Messwert%256; //Rest berechnen Zweiten4Bits=Zweiten4Bits/16; //zweiten Bits Letzte4Bits=Messwert%16; //letzte Bits anhand des Rests Berrechnen printf("\nMesswert: %hu,%hu,%hu, \n",Ersten4Bits,Zweiten4Bits,Letzte4Bits);
Dies müsste doch korrekt sein oder?
Was ich noch nicht ganz verstehe: Wieso muss ich immer mit dem Rest weiter rechnen?
-
Das ist falsch.
Wenn du 1234 eingibst, dann ist 4 die SensornummerRechne das Beispiel mal als Dezimalzahl (Basis 10) auf einem Zettel durch.