Forum: Mikrocontroller und Digitale Elektronik Bitweise if-Abfrage durch switch-Anweisung ersetzen


von Buhlmann (Gast)


Lesenswert?

Ist es möglich, eine if-Abfrage zu Stati von einzelnen Bits durch eine 
switch-case-Anweisung zu ersetzen?
1
...
2
#define BIT0 0x00
3
#define BIT1 0x01
4
#define BIT2 0x04
5
...
6
7
   x = 0b01010101;
8
9
   if (x & (1<<BIT0) {
10
         ..... }
11
   if (x & (1<<BIT1) {
12
         ..... }
13
   if (x & (1<<BIT2) {
14
         ..... }

switch-case-Versuch, der nicht geht:
1
...
2
   switch (x) {
3
      case (&(1<<BIT0)): ...; break;
4
      case (&(1<<BIT1)): ...; break;

Meine Frage - geht das ueberhaupt mit einer switch-case-Abfrage?

von Uwe (Gast)


Lesenswert?

Hallo,
ein einfaches nachsehen in einer C Sprachbeschreibung hätte geholfen.

Bitte siehe hier nach:
http://home.fhtw-berlin.de/~junghans/cref/SYNTAX/switch.html

von Buhlmann (Gast)


Lesenswert?

Du hast zwar recht, da steht aber leider nicht drinnen, ob auch der 
Zugriff auf einzelne Bits möglich ist, sondern nur klassisch ganze 
Zeichen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Da steht klar, daß mit Konstanten verglichen wird.

> Ein Ausdruck wird einmal ausgewertet und mit Konstanten verglichen.
> Bei Gleichheit werden die Anweisungen, die nach der Konstante
> stehen, abgearbeitet.
>
> In switch Anweisungen kann man nur ordinale Datentypen
> (d.h. int, long int, char, etc.) verwenden.

von Joe S. (bubblejoe)


Lesenswert?

1
switch (x) {
2
      case (0x01): ...; break;
3
      case (0x02): ...; break;

So geht es auf jeden Fall.

Mich würde es aber auch interessieren, ob es so geht wie du vorhast, da 
das ja wesentlich übersichtlicher ist.

von Karl H. (kbuchegg)


Lesenswert?

Joe B. schrieb:
>
1
switch (x) {
2
>       case (0x01): ...; break;
3
>       case (0x02): ...; break;
>
> So geht es auf jeden Fall.

 Nur macht das aber nicht das, was er vorhat.


Denn sein x ist ja nicht 0x01 oder 0x02.

Abgesehen davon macht die ganze Fragestellung keinen Sinn.
Ein switch-case kann man benutzen, wenn man genau 1 Möglichkeit von 
vielen heraussuchen muss.
Den Fall hat er aber nicht. In seinem Byte können ja auch mehrere Bits 
gleichzeitig gesetzt sein.

> da das ja wesentlich übersichtlicher ist.

Ob etwas übersichtlich geschrieben ist oder nicht, hängt nicht ganz 
unwesentlich davon ab, ob sich der Programmierer zu diesem Thema 
überlegt, wie er es übersichtlich und leicht verständlich formulieren 
kann (auch mit dem Einsatz von Funktionen und Makros, mit denen man 
Komplexität 'versteckt')

von Buhlmann (Gast)


Lesenswert?

Hmm, so wie ich es probiert hab, geht garnix, es kommt ne Fehlermeldung:

Error  1 lvalue required as unary '&' operand.

Macht denn das Switch-case eine Und-Verknüpfung? Weil Deine Version 
würde ja nur dann glaub ich funktionieren, wenn lediglich genau eines 
der Bits gesetzt ist, was ist aber, wenn bit0 und bit3 gleichzeitig 
gesetzt sind, dann wäre die Hexadecimalzahl nicht 1 oder 4, dann wäre 
die Gesamtzahl für den Fall Bit3_Bit1 0x05.

von Buhlmann (Gast)


Lesenswert?

Hmm, bei genauerem Überlegen scheint mir eigentl. für den Fall eine 
switch-Abfrage inzwischen auch eher unsinnig, denn mit der 
break-Anweisung wird das switch-Konstrukt ja beendet und es folgen keine 
weiteren Abfragen mehr und wenn es gehen würde, dann wäre es gewiss auch 
schon in vielen Beispielen z.B. in dem AVR-GCC-Tutorial verwendet 
worden.

von Karl H. (kbuchegg)


Lesenswert?

Buhlmann schrieb:

> Macht denn das Switch-case eine Und-Verknüpfung?

WElchen Teil von
1
ein switch-case vergleicht den im switch ausgewerteten Wert mit einer
2
Reihe von Konstanten (den cases) und bei Übereinstimmung wird der bei
3
diesem case beginnende Programmteil abgearbeitet
hast du nicht verstanden?


Was die einzelnen C-Konstrukte machen ist dir vorgegeben. Du kannst 
nicht die Funktionalität so abändern, wie es dir jetzt gerade in den 
Kram passt. Ein switch-case macht eine genau definierte Aktion. Wenn das 
nicht die Aktion ist, die du benötigst, dann kannst du einen switch-case 
nicht verwenden. Punkt.

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.