Bit-Operatoren, noch kleine Probleme.

Hallo,

ich programmiere seit mittlerweile 1 Jahr, aber ich hatte schon immer ein Problem mit den Bit-Operatoren. Nun habe ich einfach ganz schnell ein Programm geschrieben, dass überprüfen soll ob die Bits 3, 5, 9 gesetzt sind.

Das Programm
#include <stdio.h>

int main(void)
{
int x;

if( x & (3) && (5) && (9) )
{
printf("Diese 3 Bits wurden bei ihrer Zahl: %d gesetzt.");
}

else
{
printf("Diese 3 Bits wurden NICHT gesetzt");
}

system("PAUSE");
return 0;
}
Und jetzt ist das Proble, dass wenn diese 3 Bits gesetzt sind, es die else-Verzweigung ausführt. Nun kann ich das einfach umdrehen, dass es so aussieht.

Das Programm 2
#include <stdio.h>

int main(void)
{
int x;

if(x & (3) && (5) && (9)
{
printf("Diese 3 Bits wurden bei ihrer Zahl: %d gesetzt.");
}

else
{
printf("Diese 3 Bits wurden NICHT gesetzt");
}

system("PAUSE");
return 0;
}
Aber ich will auch verstehen, warum es mit dem 1. Programm nicht funktioniert.
Danke im voraus
 
  1. Reparier mal Dein Deutsch oder Deine Tastatur ein bischen Mühe kann man sich schon geben.
  2. Das Programm 2 unterscheidet sich nur durch eine fehlende schließende Klammer!

    Code:
    if(x & (3) && (5) && (9)
    --------------------------------^
 
Code:
if( x & (3) && (5) && (9) )
3 = 011
4 = 100
5 = 101
...
16 = 1 000
...
256 = 1000 0000

Außerdem muss es
Code:
if( (x&4) && (x&16) && (x&256) )
heißen, da && 4 automatisch zu true ausgewertet wird, da c alle > 0 als true ansieht.
 
Zuletzt bearbeitet:
  1. du hast x noch keinen Wert zugeordnet
  2. printf benötigt nach dem Format-String als weitere Parameter auch noch die Variable(n), durch welche der(bzw. die) Platzhalter ersetzt werden soll(en)
  3. im 2. Programm gibt es (wenn ich nicht ganz und gar blind bin) außer einer fehlenden Klammer keinen Unterschied zu Programm 1


Code:
if( x & (3) && (5) && (9) )
macht auch keinen Sinn...

hab zwar lange kein C mehr gecodet aber mal rein von der logischen Herangehensweise:

als erstes müsstest du mal wissen, welche Zahlen hinter "Bit 3", "Bit 5" oder "Bit 9" stecken...

Bit 3 = 0b0000000100 = 4 dezimal (oder 0x004 hex)
Bit 5 = 0b0000010000 = 16 dezimal (oder 0x0010 hex)
Bit 9 = 0b0100000000 = 256 dezimal (oder 0x0100 hex)

Was genau machen jetzt die binären Operatoren?
Beim bitweise UND werden beim Ergebnis alle Bits zu "1", bei welchen in BEIDEN Zahlen das entsprechende Bit "1" ist.

Bsp: wir möchten überprüfen, ob in der Zahl 25 das Bit 5 gesetzt ist:
Code:
25 dez = 0b00011001
& bit 5: 0b00010000
--------------------
         0b00010000
Code:
x & 0x0010
liefert also eine 16 zurück, wenn das Bit 5 in der Zahl gesetzt ist oder eine 0, wenn's nicht gesetzt ist.

und wenn alle 3 Bits gesetzt sein müssen fragst du das also folgendermaßen ab:
Code:
if ( (x&4)!=0 && (x&16)!=0 && (x&256)!=0) {
  printf("Alle 3 Bits kommen in Zahl %d vor", x);
} else {
  printf("Nee du, kommen nicht alle drei vor");
}

jetzt könnten wir die 3 Zahlen natürlich auch addieren und bekämen ein Bit-Muster, welches alle benötigten Einsen enthält:

Code:
256+16+4 = 276
oder
Code:
 0b0100000000
+0b0000010000
+0b0000000100
---------------
 0b0100010100

Code:
if ((x&276)!=0) {
  printf("Alle 3 Bits kommen in Zahl %d vor", x);
} else {
  printf("Nee du, kommen nicht alle drei vor");
}
 
Vielleicht trägt dieses Programm zum Verständnis bei:

Code:
#include <stdio.h>
#include <stdbool.h>

int main(void)
{
  int x = 276;
  int i;

  printf("dec(%d) = bin(", x);
  for(i=15; i >= 0; i--)
    printf("%d ", (x>>i) & 1);
  printf(")\n%d\n", ((x & 4) && (x & 16) && (x & 256)));
  printf("%d\n", (4 | 16 | 256));
  printf("%d\n", true && 3);
  printf("%d\n", false && 3);
  printf("%d\n", true && 0);
  return 0;
}

x muss hier natürlich manuell geändert werden ;)

Ausgabe:
dec(276) = bin(0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 )
1
276
1
0
0
 
Zuletzt bearbeitet:
Wesentlich leichter lesbar ist - wie ich finde - ein Vergleich mit Hilfe von Bitshifts:

Code:
if ( (x & (1<<2)) != 0 &&
     (x & (1<<4)) != 0 &&
     (x & (1<<8)) != 0 )
{
  printf("Alle 3 Bits kommen in Zahl %d vor", x);
}
else
{
  printf("Nee du, kommen nicht alle drei vor");
}
 
Zurück
Oben