Bitweise if-Abfrage durch switch-Anweisung ersetzen

Gast #2873285
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?
#2873347
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')
Gast #2873350
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.
Gast #2873354
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.
#2873357
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren