Bitweise Programmieren in C

Gast #6466881
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
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.)
Gast
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
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
Gast
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
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.
Gast
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
(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
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
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
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.
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.
(Firma: @home)
(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.
Beitrag #6467017 wurde von einem Moderator gelöscht.
Gast
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
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.
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.