C Verstehe die Operatoren "&" (and) und "|" (or) Bitweisen nicht

ReVo

Lieutenant
Registriert
Jan. 2006
Beiträge
567
Hallo,

ich habe hier auf meinem zettel für die zwei befehle folgendes stehen:

[Operator] & (and) [Beispiel] i1 & i2 [Bedeutung] verknüpft mit einem Bitweisen Und [Bemerkung] 1 & 0 liefert 0

[Operator] | (or) [Beispiel] b1 | b2 [Bedeutung] verknüpft mit einem Bitweisen Oder [Bemerkung] 1 | 0 liefert 1

Also irgendwie sagt mir das jetzt echt nichts. Warum ist jetzt 1 & 0 = 0 und 1 | 0 = 1 , hätte jemand eine gute erklärung?

Ich danke schonmal
Gruß
 
1. Das hier: http://de.wikipedia.org/wiki/Bitweiser_Operator

2. Stell die die Operatoren als Lichtschalter vor:
UND:
Zwei Lichtschalter hintereinander (Reihenschaltung).
Das Licht leuchtet nur, wenn Schalter A und Schalter B gedrückt sind. Wenn nur ein Schalter aus ist, dann bleibt auch das Licht aus.
Schau dir hier die Wahrheitstabelle an: http://de.wikipedia.org/wiki/Und-Gatter (Y ist das "Licht").

ODER:
Ähnlich wie beim UND, nur dass die Schalter parallel sind.
Das Licht leuchtet, wenn Schalter A oder Schalter B gedrückt ist. Oder auch wenn beide gedrückt sind.
Wieder die Tabelle: http://de.wikipedia.org/wiki/Oder-Gatter


Wenn du nun zwei Variablen "bitweise verundest", dann muss das für die einzelnen Bits der Variablen gemacht werden, und zwar anhand der verlinkten Tabelle.
Bsp:
Code:
  11010101
& 01110001
----------
  01010001
Einfacher zu merken ist folgendes: Nur wenn oben UND unten ein Einser steht, dann steht im Ergebnis auch ein Einser.

Wie würdest du die beiden Werte "verodern"?
 
Oder du stellst dir vor ein & bedeutet Multiplikation 0*1=0 und ein | ist die Addition 0+1=1.
 
Hi,

danke das wurde sehr verständlich beantwortet :) Leider brauche noch etwas hilfe... ich dachte wenn ich & kann verstehe ich den folgenden code, schaff ich aber nicht ganz

Code:
 if (1 & zahl >> i)

>> schiebt einfach die bits soviel nach rechts wie i ist . Aber irgendwie sagt mir das ganze garnicht. i ist in der aufgabe als int 0 geklariert also öh, wie sieht jetzt eigentlich die bedingung aus?

WENN 1 und zahl(egal was) in bit 0 mal nach rechts verschoben (????) - ne so lautet das sicher nicht ^^

Ich habe das gefühl, dass ich auf dem falschen pfad bin
 
Hi,

ich würd es zum Verständnis einfach mal so schreiben:

int tmp = (zahl &1 ) >> zahl; // operation (was auch immer)
if(tmp) // Bedingung
{
// tmp != 0
}
else
{
// tmp == 0
}

EDIT: oder in Worten: Wenn die Zahl ungleich Null ist ODER wenn die Zahl ungrade ist und zu gleich die Bits 1-31 ungleich 0 sind ;)
EDIT2: geht ja viel einfacher: if(Zahl != 1 && Zahl != 0) bzw if(Zahl > 1)
 
Zuletzt bearbeitet:
ICH ENTSCHULDIGE MICH! i wird immer um eins erhöht, die if schleife ist in eine for schleife drinne:

Code:
	  for(c=i; i < 8; i++)
	  {
	    if (1 & zahl >> i)

Sonst würde das ja echt keinen sinn machen. Also alles verständlich bis auf die if schleife mit der 1 & zahl >> i bedingung.
 
Zuletzt bearbeitet:
Hi,
naja das ist nur ein ausschnitt, aber sonst fehlt da eigentlich nichts. AUCH WENN, es geht ja nur um diese eine if zeile.
 
ka was das if() ohne Anweisung bringen soll, aber ich würde es mal so beschreiben:

(Ich nehm mal an das i am Anfang 0 ist)
Wenn die Zahl ungrade ist, ist die if-Bedingung gültig für alle i > 1
Wenn die Zahl grade ist oder 0 ist, ist die if-Bed. gültig für alle i
--
für was auch immer das zu gebrauchen ist :freak:
 
Ich würde sagen, dass
PHP:
if (1 & zahl >> i)
prüft, ob das i. Bit in zahl gesetzt ist.

In einer Schleife kannst du das dann zum Beispiel verwenden um die binäre Darstellung einer Zahl auszugeben:
PHP:
#include <iostream>
using namespace std;

int main()
{
	unsigned int zahl = 253;

	for(int i = 32; i >= 0; --i)
	{
		if (1 & (zahl >> i))
		{
			cout << 1;
		}
		else 
			cout << 0;
	}

	cout << endl;
}
 
Hej danke, genau um so eine binäre aufgabe ging es. Ich wusste nur nicht was diese eine zeile genau aussagen musste. Aber wenn ich das jetzt anders betrachte, nähmlich so wie du das gepostet hast:

Code:
(1 & (zahl >> i))

also mit klammern, dann leuchtet es schon eher ein ;)
Dankeschön!

PS. Wenn wir schon dabei sind, wozu genau ist die zeile:
Code:
unsigned int zahl = 253;
unsigned? und 253?

Gruß
 

Ähnliche Themen

Zurück
Oben