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
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
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
vielen dank ,dein beispiel funktioniert. frage: woher weiss die for-schleife das sie am ende angelangt ist. neuer.
@neuer Wenn Du obigen Code von Walter nicht verstehst solltest Du Dich nach einer anderen Programmiersprache umsehen. Oder erst einmal eine lernen. Sorry.
@T.S. was hast du gegen learning by doing ? Keiner wird als C-Profi geboren. Peter
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'.
@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
@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
"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.
mit der maske war mir klar, nur nicht warum die forschleife aufhört. neuer
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 ;-)
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
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
1 | #define TRUE 1
|
2 | #define FALSE 0
|
und dann verwendet.
1 | char function(char irgendwas) |
2 | {
|
3 | ...tue irgendwas mit irgendwas |
4 | return (irgendwas & 0x30); |
5 | }
|
6 | ...
|
7 | int main(void) |
8 | {
|
9 | ...
|
10 | if(function(12) == TRUE) |
11 | ...
|
12 | }
|
und wundern sich warum das nicht funktionert. Ein grundlegender Tipp: NIE mit "== TRUE" vergleichen, vergleiche immer mit "!= FALSE". }
"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
> 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;
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.