Noch eine Frage zu den Bits und den Logischen- und Bitweise UND
-
Hallo Leute,
super, mir ist hier heute schon mal geholfen worden. Ich hab jetzt jedoch noch eine Sache, die nicht nicht ganz verstehe. Ich soll anhand eines Codes den Unterschied zwischen einem Logischen und einem Bitweise UND erklären. Ich weiß, man findet total viel dazu im Net, und ich dachte, ich hätte es ach verstanden. Aber mein Code gibt mir Rätsel auf. Folgendes habe ich geschrieben:
#include <stdio.h> void main (void) { //Definiere die Zahlen 520 und 65 Oktal int a = 01010, b = 00101; printf("Logische UND Verknuepfung liefert %2i\n",a && b); printf("Bitweise UND Verknuepfung liefert %2i\n",a & b); } }
Das Bitweise UND liefert 0, was ich auch erwartet habe.
Aber wieso liefert das Logische UND auf einmal eine 1?Die Bits lauten 1010 und 0101, so das also kein einziges mit dem anderen übereinstimmt.
Vielen Dank im Voraus,
Jan
-
Für logische Operationen gilt: wahr wenn ungleich 0, falsch wenn gleich 0
01010 && 00101 == true && true == true
.Wenn der erste Ausdruck falsch ist, darf der zweite gar nicht mehr ausgewertet werden.
So in etwa musst du dir das Vorstellen:int logisches_und(int a, int b) { if (a == 0) return 0; if (b == 0) return 0; return 1; } /* Die nur teilweise Auswertung der Argumente lässt sich nur mit einem Makro nachstellen */ #define UND(a,b) (a ? (b ? 1 : 0) : 0)
Ob die Argumentwerte 1 oder 23 oder 0xDEADBEEF sind, ist für das logische Und völlig gleichgültig.
-
Das heißt, egal was ich für a und b wähle, solange beides größer null ist wird er True liefern?
Ok, sorry, hast Du unter dem Code erklärt.
Ich danke Dir vielmals.
-
CJens schrieb:
... //Definiere die Zahlen 520 und 65 Oktal int a = 01010, b = 00101;
...
Die Bits lauten 1010 und 0101, so das also kein einziges mit dem anderen übereinstimmt.Nein lauten sie nicht.
a = 01010 = 0b 000 001 000 001 000 b = 00101 = 0b 000 000 001 000 001
Da sind zwar auch die Bits unterschiedlich aber du verwechselst Oktal mit Dual.
Oktal ist zur Basis 8, Dual ist zur Basis 2.Auf manchen Compilern (für Mikrocontroller) gibt es auch 0b für Dualzahlen, im Standard nicht. Du musst den Umweg über Hex oder Oktal gehen.
-
CJens schrieb:
Das heißt, egal was ich für a und b wähle, solange beides größer null ist wird er True liefern?
Solange es ungleich 0 ist. Negative Zahlen sind auch true.