Forum: Mikrocontroller und Digitale Elektronik Bitweise Programmieren in C


von Sina (Gast)


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. :)

von A. S. (Gast)


Lesenswert?

Sina schrieb:
> kommt eine komische Rückgabe)

Setze Warnungen und Output hier rein. Dann siehst Du es selber.

von Ingo Less (Gast)


Lesenswert?

Deine Funktionen sind jedenfalls richtig. Nur das printf nach dem return 
wird nie ausgeführt!

von Sina (Gast)


Lesenswert?

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.)

von Sina (Gast)


Lesenswert?

Ansonsten Warnungen zeigt es mir nicht an, das Programm läuft durch ohne 
fehlermeldungen

von sid (Gast)


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

von AVerr (Gast)


Lesenswert?

Sina schrieb:
> Eingabe:11011011
> a) 11010883
> b) 11011015
>  c) 1

Es funktioniert schon, nur wird deine Eingabe nicht binär, sondern 
dezimal interpretiert ...

von (prx) A. K. (prx)


Lesenswert?

Sina schrieb:
> Eingabe:11011011

Woher nimmst du die Vorstellung, dass 11 Mio in ein Byte passen?

von sid (Gast)


Lesenswert?

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

von Sina (Gast)


Lesenswert?

und wie mache ich das, dass es als binär gewertet wird? :`D

von Sina (Gast)


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

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

... 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);
}

von (prx) A. K. (prx)


Lesenswert?

Apollo M. schrieb:
>    return x & 0x5F;

Das gäbe bei mir einen Minuspunkt. ~0xA0 wäre ok.

von (prx) A. K. (prx)


Lesenswert?

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.

von Sina (Gast)


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);
> }

von (prx) A. K. (prx)


Lesenswert?

Tu wenigstens so, als ob du dich bemühst. Macht einen besseren Eindruck.

von Sina (Gast)


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

von Stefan F. (Gast)


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.
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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().

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

(prx) A. K. schrieb:
> Das gäbe bei mir einen Minuspunkt. ~0xA0 wäre ok.

.. dann nenne mal deine Pros/Cons!

von AVerr (Gast)


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.

von (prx) A. K. (prx)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

: Bearbeitet durch User
von Apollo M. (Firma: @home) (majortom)


Lesenswert?

(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 ..."

: Bearbeitet durch User
von (prx) A. K. (prx)


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.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

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.

: Bearbeitet durch User
Beitrag #6467017 wurde von einem Moderator gelöscht.
von Apollo M. (Firma: @home) (majortom)


Lesenswert?

(prx) A. K. schrieb:
> m Startbeitrag steht nichts von uint8_t.

... da steht aber byte und das verwendete int passt da eher nicht.

von Wühlhase (Gast)


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).

von (prx) A. K. (prx)


Lesenswert?

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.

: Bearbeitet durch User
von Wühlhase (Gast)


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.

von Sina (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.