Forum: Compiler & IDEs bit7 bis bit0 einer uint8_t lesen


von neuer (Gast)


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

von Walter (Gast)


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

von neuer (Gast)


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

von neuer (Gast)


Lesenswert?

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

neuer.

von peter dannegger (Gast)


Lesenswert?

Wenn das 1-Bit unten rausgefallen ist.

Peter

von T.S. (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Lesenswert?

@T.S.

was hast du gegen learning by doing ?

Keiner wird als C-Profi geboren.


Peter

von Karl H. (kbuchegg)


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

von T.S. (Gast)


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

von Stefan K. (_sk_)


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

von neuer (Gast)


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.

von neuer (Gast)


Lesenswert?

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

neuer

von neuer (Gast)


Lesenswert?

hatte ich für "T.S" vergessen..

sorry...


neuer

von André K. (freakazoid)


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

von Stefan K. (_sk_)


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

von Werner B. (Gast)


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

von neuer (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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;

von Stefan K. (_sk_)


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

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.