Bitweise Programmieren in C

Gast #6466881
Lesenswert?

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. :)
Gast #6466923
Lesenswert?

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
Gast #6466933
Lesenswert?

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
Gast #6466943
Lesenswert?

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);
> }
Gast #6466950
Lesenswert?

(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
Gast #6466954
Lesenswert?

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.
Beitrag #6466960 wurde von einem Moderator gelöscht.
Moderator (Firma: Titel) Persönliche Seite #6466965
Lesenswert?

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().
Gast #6466978
Lesenswert?

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.
#6467006
Lesenswert?

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.
Beitrag #6467017 wurde von einem Moderator gelöscht.
Gast #6467032
Lesenswert?

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).
Gast #6467046
Lesenswert?

Ok, ein kleines Beispiel:

Das hier setzt das dritte Bit:
1
a = ?       //Irgendeine Zahl
2
b = 0x4;    //Entspricht 0b00000100
3
c = a | b;  //Bitweise ODER-Operation, c enthält das Ergebnis

Den Rest kriegste selber noch hin.

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