Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

Bit-Operatoren, noch kleine Probleme.

Diskussion: Bit-Operatoren, noch kleine Probleme. im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hallo, ich programmiere seit mittlerweile 1 Jahr, aber ich hatte schon immer ein Problem mit den Bit-Operatoren. Nun habe ...

Antwort
Alt 04.02.11, 14:35   #1 (permalink)
 
Registriert seit: 04.02.11
hamade9 Leistung: Facit NTK
Likes: 0
Standard Bit-Operatoren, noch kleine Probleme.

Anzeige

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

Zitat:
#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
Zitat:
#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
hamade9 ist offline   Mit Zitat antworten
Alt 04.02.11, 15:14   #2 (permalink)
 
Benutzerbild von Vyger
 
Registriert seit: 04.12.03
Vyger Leistung: Z3
Likes: 11
Standard

  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)
    --------------------------------^
Vyger ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 04.02.11, 15:20   #3 (permalink)
Member of Honour
 
Benutzerbild von xrayn
 
Registriert seit: 05.03.08
xrayn Leistung: Opteronxrayn Leistung: Opteronxrayn Leistung: Opteronxrayn Leistung: Opteronxrayn Leistung: Opteron
Likes: 246
Standard

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.

Geändert von xrayn (04.02.11 um 16:05 Uhr)
xrayn ist offline   Mit Zitat antworten
Alt 04.02.11, 15:41   #4 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
Standard

  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


Zitat:
Zitat von hamade9 Beitrag anzeigen
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");
}
beavisbee ist offline   Mit Zitat antworten
Alt 04.02.11, 16:01   #5 (permalink)
Member of Honour
 
Benutzerbild von xrayn
 
Registriert seit: 05.03.08
xrayn Leistung: Opteronxrayn Leistung: Opteronxrayn Leistung: Opteronxrayn Leistung: Opteronxrayn Leistung: Opteron
Likes: 246
Standard

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:
Zitat:
dec(276) = bin(0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 )
1
276
1
0
0

Geändert von xrayn (04.02.11 um 16:05 Uhr) Grund: Ausgabe hinzugefügt
xrayn ist offline   Mit Zitat antworten
Alt 04.02.11, 19:22   #6 (permalink)
 
Registriert seit: 06.06.09
Thunderb0lt Leistung: 8086
Likes: 6
Standard

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");
}
__________________
A good programmer looks both ways before crossing a one-way street.

Die Politik kann uns nur für so dumm verkaufen, wie wir sind.
Thunderb0lt ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Bit-Operatoren, noch kleine Probleme.
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61