Hi zusammen,
Ich hoffe auf eure Hilfe. Wir sollen in Visual Studio folgende Aufgabe
programmieren:
Aufgabe (1) (5/5/5 Punkte)
In der Programmierung von Mikrocontrollern oder APIs1 ist es notwendig,
Bits zu löschen, zu
setzen oder abzufragen.
Schreiben Sie dazu bitte folgende Funktionen:
a) Eine Funktion, die in einem Byte die Bits 5 und 7 löscht und das
veränderte Byte
zurückgibt.
b) Eine Funktion, die in einem Byte die Bits 0 und 2 setzt und das
veränderte Byte
zurückgibt.
c) Eine Funktion, die in einem Byte überprüft, welchen Zustand das Bit 7
besitzt. Es soll der
entsprechende Wert (0 oder 1) zurückgeben werden.
Testen Sie durch geeignete Funktionsaufrufe im Main Programm Ihre
Funktionen
Ich habe damit leider einige Probleme. Meine bisherige Lösung sah
folgendermaßen aus (funktioniert leider nicht, bzw kommt eine komische
Rückgabe):
//Aufgabe1
//a)
int x;
int f00(int x)
{
x = x & ~(0b10100000);
return x;
printf("%i", x);
}
//b)
int f01(int x)
{
return x | 0b0000101;
}
//c)
int f02(int x)
{
return(x >> 7) & 1;
}
void main()
{
int Zahl;
int VAZahl, VBZahl, VCZahl;
printf("Eingabe:");
scanf_s("%i", &Zahl);
VAZahl = f00(Zahl);
printf("a) %i \n", VAZahl);
VBZahl = f01(Zahl);
printf("b) %i \n ", VBZahl);
VCZahl = f02(Zahl);
printf("c) %i", VCZahl);
}
Vielen Dank für eure Zeit und Hilfe. :)
So sieht meine Rückgabe aus:
Eingabe:11011011
a) 11010883
b) 11011015
c) 1
(das printf in der ersten Funktion hinter dem return war ein versehen,
das sollte da eigentlich nicht hin.)
ich muss ganz ehrlich sagen, dass ich für bytes immer char benutze
oder n uint8_t oder oder oder... aben nicht int weil das mindestens
2byte sind, meist sogar vier.
Naja und da
Sina schrieb:> Eine Funktion, die in einem Byte die Bits 5 und 7 löscht und das> veränderte Byte
da Byte steht wär für mich die int raus ;)
'sid
Sina schrieb:> Eingabe:11011011> a) 11010883> b) 11011015> c) 1
Es funktioniert schon, nur wird deine Eingabe nicht binär, sondern
dezimal interpretiert ...
Sina schrieb:> So sieht meine Rückgabe aus:>> Eingabe:11011011
AUTSCH!
ja wenn DU binäres eingeben willst musst Du zuerst deine Eingabe auch
als solche erfassen..
das Programm nimmt das als elsmillionenelftausendundelf
'sid
ohje, ich fürchte ich kenne mich beim programmieren wirklich gar nicht
aus. Das ist nicht wirklich mein Gebiet, ich muss es halt nur im Studium
mitmachen. Also entschuldigt wenn ich blöde Fragen stelle
... es gibt viele Möglichkeiten, hier mal weitere
//a, clear
uint8_t f00(uint8_t x) {
return x & 0x5F;
}
//b, set
uint8_t f00(uint8_t x) {
return x | 0x05;
}
//c, test
bool f02(uint8_t x) {
return !!(x & 0x80);
}
Sina schrieb:> und wie mache ich das, dass es als binär gewertet wird?
In C gibt es neben der dezimalen Darstellung traditionell auch oktale
und hexadezimale Darstellung - aber keine binäre. "0b" als Präfix war
bisher kein Standard. Sowohl printf als auch scanf haben Parameter für
Hex-Darstellung.
Ich muss das in visual studio in c programmieren und da funktioniert das
meiner Meinung nach so nicht
Apollo M. schrieb:> //a, clear> uint8_t f00(uint8_t x) {> return x & 0x5F;> }> //b, set> uint8_t f00(uint8_t x) {> return x | 0x05;> }> //c, test> bool f02(uint8_t x) {> return !!(x & 0x80);> }
(prx) A. K. schrieb:> Tu wenigstens so, als ob du dich bemühst. Macht einen besseren> Eindruck.
Sry, war nicht böse gemeint. Ich versuche das schon den ganzen Tag
hinzubekommen und habe 20Uhr Abgabefrist und sitze ein wenig auf heißen
Kohlen. Das ist halt nur die eine Aufgabe der Abgabe die ich gar nicht
auf die Reihe bekomme
Funktionen zum Einlesen und Ausgeben von Binärzahlen musst du dir selbst
schreiben, da die C Bibliothek so etwas nicht enthält.
Aber ich denke, Interaktive ein/ausgabe war in der Aufgabe nicht
verlangt. Teste einfach mit dezimaler Schreibweise und kontrolliere das
Ergebnis mit dem Taschenrechner.
Sina schrieb:> ohje, ich fürchte ich kenne mich beim programmieren wirklich gar nicht> aus. Das ist nicht wirklich mein Gebiet, ich muss es halt nur im Studium> mitmachen.
Ich kenne Leute, die studieren Lebensmitteltechnik. Die müssen nicht
programmieren.
Sina schrieb:> versuche das schon den ganzen Tag ... und habe 20Uhr Abgabefrist
Und du hast die Aufgabe heute erst bekommen? Krasse Anforderungen an
deiner Schule!
Sina schrieb:> Testen Sie durch geeignete Funktionsaufrufe im Main Programm Ihre> Funktionen
Da steht nirgends was, dass man die Eingaben oder Ausgaben binär wie
z.B. 10011100 machen muss. Also ist auch eine Hexzahl auf jeden Fall
binär genug.
Und zum Einlesen von Hexzahlen mit scanf() gibt es den
Hex-Format-Specifier:
https://www.includehelp.com/c-programs/input-a-hexadecimal-value-using-scanf.aspx
Den selben Specifier gibts dann für die Ausgabe auch für printf().
Stefan ⛄ F. schrieb:> Aber ich denke, Interaktive ein/ausgabe war in der Aufgabe nicht> verlangt.
Ja, ich würde das auch direkt mit ein paar festen Werten testen und mir
den ganzen scanf-Zirkus sparen. Bei direktem Aufruf der Funktion kann
man ja auch die binäre Schreibweise benutzen, z.B. f00(0b101010)
Bei Teil a) geht es um Bits 5 und 7, da würde ich einfach mal folgende 4
Werte testen:
1. Bits 5 und 7 sind nicht gesetzt, z.B. 0
2. Bit 5 ist gesetzt, 7 nicht, z.B. 0b101010 (42)
3. Bit 7 ist gesetzt, 5 nicht, z.B. 0b10010010 (146)
4. Bits 5 und 7 sind gesetzt, z.B. 0b10101010 (170)
Welche Werte da jeweils nach der Anwendung der Funktion rauskommen
müssen lässt sich ja leicht selbst ausrechnen.
So kann man sich dann auch für die anderen Teilaufgaben passende
Beispielwerte suchen.
Apollo M. schrieb:>> Das gäbe bei mir einen Minuspunkt. ~0xA0 wäre ok.>> .. dann nenne mal deine Pros/Cons!
0x5F löst die Aufgabe nur bei Bytes mit exakt 8 Bits.
AVerr schrieb:> Bei direktem Aufruf der Funktion kann> man ja auch die binäre Schreibweise benutzen, z.B. f00(0b101010)
M.W. gibt es in C bisher offiziell keine binary literals (jedoch in
C++14). Allerdings gibt es sie in manchen Implementierungen. Folglich
hängt man von der Toleranz desjenigen ab, der die Antwort bewertet.
(prx) A. K. schrieb:> 0x5F löst die Aufgabe nur bei Bytes mit exakt 8 Bits.
OK, guter Punkt!
Aber ein Minuspunkt begründet das nicht, eher gibt es keinen extra
Pluspunkt.
Hier war aber auch nicht mehr gewünscht ... und uint8_t stützt das auch,
"a) Eine Funktion, die in einem Byte die Bits 5 und 7 löscht und das
veränderte Byte ..."
Apollo M. schrieb:> Aber ein Minuspunkt begründet das nicht, eher gibt es keinen extra> Pluspunkt.
Also gut, Punktabzug statt Minuspunkt. ;-)
> Hier war aber auch nicht mehr gewünscht ...
Bei einem Byte mit 9 Bits wird bei 0x5F das 9te Bit gelöscht. Wenn in
der Aufgabe oder dem Kontext ein Byte als 8 Bits definiert wird, passt
es. Andernfalls hängt man von der Toleranz desjenigen ab, der die
Antwort bewertet.
Apollo M. schrieb:> und uint8_t stützt das auch,
Im Startbeitrag steht nichts von uint8_t. Sinas persönliche Annahmen
würde ich nicht als Referenz für die Aufgabe werten.
Das heißt ja nicht, daß man uint8_t nicht benutzen kann. Was nicht
explizit verboten ist, ist erlaubt.
Ansonsten:
@Sina:
Überleg dir mal, was du mit logischen Verknüpfungen machen kannst. Einen
Operanden in der Verknüpfung kannst du ja selber wählen.
Und ob du eine Zahl binär oder hexadezimal darstellst, ist dem Computer
auch egal. Der Windows-Taschenrechner kann das auch für dich umrechnen
(einfach auf Programmiereransicht gehen).
Apollo M. schrieb:> ... da steht aber byte und das verwendete int passt da eher nicht.
Ein Byte passt immer in int, aber nicht immer in uint8_t.
Wühlhase schrieb:> Das heißt ja nicht, daß man uint8_t nicht benutzen kann. Was nicht> explizit verboten ist, ist erlaubt.
Bei Bytes > 8 Bits gibt es u.U. kein uint8_t.
Vielen lieben Dank euch allen für eure Hilfe, ich bin jetzt noch
fristgerecht fertig geworden und konnte die Aufgaben eben hochladen.
Ich wünsche euch einen schönen Abend! :D