www.mikrocontroller.net

Forum: Compiler & IDEs bit7 bis bit0 einer uint8_t lesen


Autor: neuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, ich möchte von einer uint8_t die bits 7 bis bits 0 abfragen ob
diese 1 sind in einer for-schleife.
finde keinen weg mit winavr-c, da gibt es einmal & und einmal &&.
wer kann mir hier mit einer einfachen lösung weiterhelfen und
darstellen.

neuer

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich weiß nicht genau was du willst?

& ist das bitweise AND
&& ist das logische AND

was du willst ist vielleicht:

for (mask=0x80; mask; mask=mask>>1 )
   if ( byte&mask )
       ....

Grüße
Walter

Autor: neuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich möchte prüfen ob das jeweilige bit gesetzt ist von einem byte,
angefangen von bit7 des bytes bis bit0.
wenn es jeweils gesetzt ist, soll bei true was ausgeführt werden und
bei false.

neuer

Autor: neuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank ,dein beispiel funktioniert.
frage: woher weiss die for-schleife das sie am ende angelangt ist.

neuer.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das 1-Bit unten rausgefallen ist.

Peter

Autor: T.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@neuer
Wenn Du obigen Code von Walter nicht verstehst solltest Du Dich nach
einer anderen Programmiersprache umsehen. Oder erst einmal eine lernen.
Sorry.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@T.S.

was hast du gegen learning by doing ?

Keiner wird als C-Profi geboren.


Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
learning by doing ist super.
Nur funktioniert es bei so manchen Grundlagen
nicht richtig. >>, &, && und das Verhalten von
for-Schleifen sind in jedem C-Buch beschrieben.
Erst mal eine 1/2 Stunde lesen, dann das 'doing'
anwerfen.

Wie Dir so mancher Profi bestaetigen wird: Ab
und an mal mit einem printf (oder Äquivalent)
interessante Zwischenergebnisse im laufenden
Programm anschauen, schafft schnell Klarheit.
Das ist dann tatsächlich 'learning by doing'.

Autor: T.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter

>was hast du gegen learning by doing ?
Garnichts, habe ich auch gemacht.

>Keiner wird als C-Profi geboren.
Das stimmt. Ich denke mal es gibt gar keinen 'echten' Profi.

Mag sein das ich etwas voreilig geantwortet habe.

Aber nach einem langen read-only in diesem Forum kann ich Jörg's
manchmal sehr kritische Äußerungen verstehen. Irgendwann fällt der
Tropfen in das volle Fass und es läuft dann einfach über.

Wenn 'neuer' nicht sofort der magische Wert 0x80 in's Auge springt
dann weiß ich auch nicht mehr weiter. Vielleicht sollte er sich zuerst
einige Grundlagen aneignen. Ich meine wie funktionieren shift
operationen >> und so weiter.

Torsten

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@all:
ich finde es eine legitime Frage. Mir ist learning by doing viel lieber
als learning by copying ...

@neuer:
mal Dir einfach mal auf, welche Werte mask in den einzelnen
Schleifendurchläufen hat, dann verstehst Du sicher bald, was passiert:

1: 0x80  10000000binär
2: 0x40  01000000b
3: 0x20  00100000b
4: ...

Gruß, Stefan

Autor: neuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"T.S."

reg dich nicht auf.
ich ärgere mich nicht darüber was du geschrieben hast, finde ich aber
nicht toll.
du bist noch jung, kümmere dich mal um die dinge die dein leben noch
stark beeinflussen werden. ich brauche das nicht mehr weil ich mich als
junger pensionär wohlfühle und von diene steuern lebe.

Autor: neuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit der maske war mir klar, nur nicht warum die forschleife aufhört.

neuer

Autor: neuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hatte ich für "T.S" vergessen..

sorry...


neuer

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das jetzt so Brauch?
Muß man als Pensionär jetzt erwähnen, daß man auf Kosten der aktuellen
Steuerzahler lebt?
Oder ist 'neuer' gar 'pebisoft'?
Komische Welt das hier ...
shutdown -h now ;-)

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei C kann man sehr faul sein ...

statt               mask != 0
kann man einfach    mask
schreiben.
Der Ausdruck ist immer dann TRUE, wenn mask ungleich NULL ist.

Deswegen läuft die for-Schleife, bis das Einser-Bit unten rausgeschoben
wird und mask damit NULL ist.

Gruß, Stefan

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit dem "Der Ausdruck ist immer dann TRUE, wenn mask ungleich NULL
ist." kann für Anfänger ganz schön zur Falle werden falls einige
Randbedingungen nicht beachtet werden.

Und zwar: die "schönen" Macros TRUE und FALSE

Da wird definiert
#define TRUE 1
#define FALSE 0

und dann verwendet.
char function(char irgendwas)
{
   ...tue irgendwas mit irgendwas 
   return (irgendwas & 0x30);
}
...
int main(void)
{
   ...
   if(function(12) == TRUE)
...
}
und wundern sich warum das nicht funktionert.

Ein grundlegender Tipp: NIE mit "== TRUE" vergleichen,
vergleiche immer mit "!= FALSE".
}

Autor: neuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Bei C kann man sehr faul sein ..."

ich habe gehört und versuche es einzuhalten, in "c" diszipliniert zu
proggen als anfänger.

warum fängt man in c wieder als fachmann...an zu schlabbern.
ist das insider-c.

neuer

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ein grundlegender Tipp: NIE mit "== TRUE" vergleichen,
> vergleiche immer mit "!= FALSE".

Stattdessen lieber gleich richtige Vergleiche vornehmen.

Wenn der zu testende Wert ein boolean ist (d.h. das Ergebnis
einer boolschen Operation wie == != && ||, oder aber im
Programm nur mit TRUE und FALSE bzw. true und false erzeugt
worden ist), dann einfach direkt für den Test benutzen:

wert = a != b;  /* als Beispiel */

if (wert) tu_was;

Was soll an

if (wert != FALSE) tu_was;

besser sein?  Wenn der Test nicht in wert zwischengespeichert
worden wäre, würde man doch auch schreiben

if (a != b) tu_was;

und nicht

if ((a != b) != FALSE) tu_was;

Andererseits sollte man numerische Werte ,,der Schönheit
halber'' besser gegen numerische Werte vergleichen.  Das
Ergebnis bleibt das selbe, aber dem geneigten Leser wird
dann sofort klar, dass es sich um einen numerischen
Vergleich handelt:

for (mask = 0x80; mask != 0; mask >>= 1) tu_was;

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wer hat denn überhaupt was von Macros gesagt? TRUE und FALSE ist für
mich einfach der Wertebereich boolscher Ausdrücke.

Und die Aussage
if 17 == TRUE
klingt doch ziemlich merkwürdig, oder? Das könnte man allerhöchstens
mit 42 so stehen lassen ;-)

Viele Grüße, Stefan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.