Anfänger Problem if(wert & 1)...Verständnisfrage

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
beginner123
Beiträge: 7
Registriert: Mo Feb 20, 2012 4:40 pm

Anfänger Problem if(wert & 1)...Verständnisfrage

Beitrag von beginner123 » Mo Feb 20, 2012 5:45 pm

Hallo,

schon taucht meine erste Frage auf:
Ich bin gerade im C-Tut bei den Schleifen und zwar an der Stelle: Unterbrechen von Wiederholungen mit "continue".
Ich hab verstanden (oder vielleicht doch nicht ganz), um was es bei modulo und bei continue geht, jedoch will es mir partout nicht ins Hirn, warum ein

Code: Alles auswählen

if(wert & 1)
bedeutet, dass die Zahl nicht durch zwei teilbar ist :?:

Der gesamte Code der Aufgabe:

Code: Alles auswählen

#include <stdio.h>
 
int main(void)
{
  int wert;
  for( wert = 1; wert <= 10; wert = wert + 1 )
  {
    printf( "Ich bin bei '%d'\n", wert );
 
    if(wert & 1)
      continue;       
 
    printf( "  Dieser Wert ist durch zwei teilbar.\n" );
  }
 
  return 0;
}
Wieso nimmt man hier "...& 1" als Ausdruck, um damit die Bedingung zu formulieren, dass, wenn der Wert nicht durch 2 teilbar sein sollte, dann...? Sorry für die turbo-Noob-Frage aber ich möchte es gern verstehen. Bedeutet "variable & 1" denn generell immer, dass etwas nicht durch 2 teilbar ist?? Ist das die Zuweisung von 1 an die Variable "Wert"? Kann ich mir irgendwie nicht vorstellen. Und wieso dann & 1, wenn es doch um Teilbarkeit durch 2 geht :? ?? Steh grad voll auf der Leitung.

Googeln und Forum Suche brachten mich leider auch nicht weiter. So banal die Fragestellung wohl sein mag :roll: aber mir erschließt sich einfach der Sinn nicht. Wäre echt sehr dankbar für einen Tipp...

Grüßle
beginner

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Anfänger Problem if(wert & 1)...Verständnisfrage

Beitrag von cloidnerux » Mo Feb 20, 2012 6:21 pm

Ich hab verstanden (oder vielleicht doch nicht ganz), um was es bei modulo und bei continue geht, jedoch will es mir partout nicht ins Hirn, warum ein

Code: Alles auswählen

if(wert & 1)
bedeutet, dass die Zahl nicht durch zwei teilbar ist
Weil du im Dezimalsystem denkst.
Der Computer arbeitet im Dual-System, daher werden alle Zahlen in form von Nullen und Einsen gespeichert, wobei jede Stelle, ähnlich dem Dezimalsystem, wo jede stelle eine Potenz von 10 ist, eine Potenz von 2 ist.
damit ist die erste(bzw letzte Stelle) entweder 1(Dezimal) oder 0(Dezimal) und definiert so ob die Zahl gerade ist oder nicht, da eine ungerade Zahl bei Potenzen von 2 nur mit der Addition von 1 entstehen kann.

Das "&" ist ein Binäres UND, damit wird jede Stelle einer binären Zahl mit der entsprechenden Stelle der anderen Zahl UND-Verknüpft. Google das mal und versuche dann zu Erklären, warum das dann die Divisionsmöglichkeit durch 2 erklärt.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Anfänger Problem if(wert & 1)...Verständnisfrage

Beitrag von fat-lobyte » Mo Feb 20, 2012 6:22 pm

So ne Noob-Frage ist das gar nicht. Du musst nämlich wissen, dass "&" ein Binäroperator ist! Und zwar im Gegensatz zu "&&", welches eine logische verknüpfung darstellt.

Siehst du dir an, wie Integer kodiert sind: http://www.proggen.org/doku.php?id=theo ... esentation , also z.B. so:

23 (dez) = 10111 (bin)

Dabei gilt vereinfacht (für positive Zahlen), dass der Wert der Ziffer an der (n+1)-ten Stelle (1 oder 0) mit 2^n multipliziert wird. Das ist bei der ersten Stelle (n=0): 1*2^0 = 1.

22 wäre in binär:
22 (dez) = 10110 (bin)
Hier ist die erste Stelle eine 0, also 0*2^0=0.

Und hier kann man bereits ablesen ob die Zahl durch zwei teilbar ist oder nicht! Ist die letzte Ziffer eine 1, kann die Zahl gar nicht mehr durch 2 teilbar sein.

Und hier kommt der Binäroperator & ins Spiel:
Er überprüft jedes Bit-Paar der operanden darauf, ob sie beide 1 sind oder nicht.
z.B.: (in binär)

1 & 1 = 1

01
11 =
01


11 &
11 =
11

ABER:
1101 &
0010 =
0000 = 0

10 &
01 =
00 = 0

Also: hast du eine beliebige Zahl, z.B. 23 und &-est sie mit einer 1 passiert folgendes:
10111 &
00001 =
00001 = 1

Also: das Ergebnis ist 1, wenn die letzte Ziffer eine 1 ist, also die Zahl ungerade, also NICHT teilbar.

Bei 22 passiert folgendes:
10110 &
00001 =
00000 = 0
Hier ist das Ergebnis 0! Die letzte Ziffer ist 0, also ist die Zahl durch 2 Teilbar.

Ich hoffe das war einigermaßen verständlich. Wenn nicht, bitte nachfragen!

Kleine Quizzfrage: wie würde die Abfrage aussehen, wenn wir prüfen wollten, ob die Zahl durch 4 (schon) teilbar ist?
Haters gonna hate, potatoes gonna potate.

beginner123
Beiträge: 7
Registriert: Mo Feb 20, 2012 4:40 pm

Re: Anfänger Problem if(wert & 1)...Verständnisfrage

Beitrag von beginner123 » Mo Feb 20, 2012 6:37 pm

Vielen Dank euch beiden, cloidnerux und fat-lobyte für die schnellen Antworten !! Die Links und die Erklärungen helfen mir jetzt erstmal weiter :-) !!

Vor ein paar Minuten hab ich mal noch den Test gemacht und mir "wert & 1" mal ausgeben lassen und siehe da:
Bei 1 war das eine 1, bei 2 war das eine 0, bei 3 wieder eine 1, bei 4 wieder eine 0.. ;-D...so langsam dämmerte mir etwas!
Wußte bis jetzt gar nicht, nach was ich suchen sollte. Nun weiß ich aber, dass das ein Binäroperator ist.

Fettes Dankeschön euch nochmals! Ich werd mich jetzt erstmal intensiver mit binärer Schreibweise und binären Operatoren beschäftigen!

Grüße
beginner

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Anfänger Problem if(wert & 1)...Verständnisfrage

Beitrag von Xin » Mo Feb 20, 2012 8:17 pm

Asche auf mein Haupt...

Wir hatten uns entschlossen diese Abfrage mit Wert % 2 auszutauschen, weil die Erklärung zu aufwendig war. Und das habe ich auch gemacht - nur die Abfrage kam zweimal vor. ^^

Die Abfrage Wert & 1 ist weniger aufwendig als Wert % 2, ihr Ergebnis ist aber das gleiche.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

beginner123
Beiträge: 7
Registriert: Mo Feb 20, 2012 4:40 pm

Re: Anfänger Problem if(wert & 1)...Verständnisfrage

Beitrag von beginner123 » Do Feb 23, 2012 11:24 pm

Hi,

so ich habs jetzt glaub kapiert ;-) dank eurer Hilfe! @Xin, vielen Dank, ich habs abends als ich nochmal reinsah, gesehen, daß ihr es schon geändert habt, dachte erst, ich fange schon langsam an zu spinnen :D ("...da stand doch vorhin noch n wert & 1 ?? ") lol. Aber es war ganz gut so, so hab ich mich mit dem Thema mal beschäftigt.

Also ich bin eure Hinweise, entsprechende Links und Litaratur zu binären Operatoren durchgegangen und weiß nun dass für den Vergleich mit dem Binäroperator ausschlaggebend ist, ob eben beim Vergleich eine 0 oder eine 1 herauskommt.
Bei 0 geht das Ergebnis "auf" bzw. ist teilbar durch die entsprechende Zahl ohne Rest. Bei 1 gibts einen Rest, ist also nicht "sauber" teilbar.

Bei der Division (oder auch Multiplikation) von binären Zahlen, gibt es für Division das sog. Right Shift, dh. ein "Verrutschen" um ein Zeichen nach rechts entspricht dem Teilen der Zahl durch 2.(Analog Multiplikation nach links).

Also, z.B. in Dezimal 8 : 2 = 4 ist das in binärer Schreibweise 1000 : 0010 = 0100.
Es geht um die Teilbarkeit durch 2, also wandert die '1' bei 1000 um eins nach rechts. Der freie Platz wird mit Null(en) aufgefüllt.

Und ich hab ja von fat-lobyte die Quizzfrage gestellt bekommen :D , wie die Abfrage aussähe bzgl. der Teilbarkeit durch 4. Denn auf dem Papier ist es klar, ich gehe einfach 2 Zeichen weiter nach rechts und hab das Ergebnis:
0010 bzw. 2.

Normal ist man dann geneigt, (wert & 2) zu schreiben, weil man denkt: 2 Sprünge nach links entspricht '4'. Ist aber eben falsch.

Bis ich mal draufkam, dass ja beim Binäroperator, das "glatte" bzw. saubere Aufgehen des Ergebnisses ja immer mit einer '0' definiert wird. Ich muss mir die '0' quasi "reservieren", wenn es um die richtige Definition für 'x' im Ausdruck (wert & x) geht. Und die '1' im Ausdruck (wert & 1) bedeutet an der Stelle nicht, dass ich 1 Sprung nach rechts gehe, und folglich der flasche Schluss daraus, dass man bei Teilbarkeit durch 4 dann einfach (wert & 2) schreibt, sondern, dass ich die '1' und die '0' jeweils als Ergebnis hab. Das beschreibt ja letztlich die Teilbarkeit durch 2. Ich habe immer 2 Ergebnisse: '1' und '0', "geht nicht auf" bzw. "geht auf". So auch bei 4: Als mögliche Ergebnisse hab ich 1, 2, 3 und '0'. Der Operator fängt bei Zahl 1 an zu prüfen, läuft durch bis 4 und bei 4 gibts dann das Ergebnis '0', 4 ist durch 4 teilbar.

Somit muss bei der Prüfung der Teilbarkeit mit 4 die Abfrage: if(wert & 3) lauten. Hat auch geklappt lt. meinem Terminal. Vorallem sieht man das da gut.

Wo ich mir noch nicht 100%ig sicher bin, aber glaube es zu wissen ;-), die Teilbarkeitsprüfung mit dem binären Operator geht (zum. bei int) nur mit durch-2-teilbaren Zahlen (??). Denn alle tests mit wert & 2, wert & 4 usw...waren fehlerhaft, da ja nicht mehr im "Zweiersystem" gerechnet wird sondern eben - durch die zusätzliche, geforderte "Null" als Ergebnis - nicht mehr 1 Zeichen (:2) oder 2 Zeichen (:4) nach rechts gehe, sondern 3 Zeichen (: 3), also 1, 2, 0, was ja nicht geht(?). Dummerweise teilt mein TR ganz brav 1001/0011 = 0011 :? Na ja, kann aber auch sein, dass ich momentan den Wald vor lauter Bäumen nicht mehr sehe. Werd mich morgen damit weiterbeschäftigen.

Uff, so mein Gehirn ist mittlerweile ein Schwamm :D ...aber ich musste mal kurz über meine frisch gewonnenen Erkenntnisse philosophieren, damit ich's auch wirklich kapiere :D.
Würde mich freuen, zu hören, was ihr dazu meint, bzw. ob ich irgendwo noch einen Denkfehler oder was falsch beschrieben habe.

Danke euch nochmals, ihr habt mir wirklich weitergeholfen :-)!!

beginner

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Anfänger Problem if(wert & 1)...Verständnisfrage

Beitrag von Xin » Fr Feb 24, 2012 12:15 am

beginner123 hat geschrieben:so ich habs jetzt glaub kapiert ;-) dank eurer Hilfe! @Xin, vielen Dank, ich habs abends als ich nochmal reinsah, gesehen, daß ihr es schon geändert habt, dachte erst, ich fange schon langsam an zu spinnen :D ("...da stand doch vorhin noch n wert & 1 ?? ") lol. Aber es war ganz gut so, so hab ich mich mit dem Thema mal beschäftigt.
Die Seiten sind nicht statisch, sondern können jederzeit geändert und verbessert werden. Das kann schnell gehen.
Die binären Operatoren sind im Tutorial noch nicht enthalten. Schon alleine deswegen dürfen sie eigentlich gar nicht auftauchen.
beginner123 hat geschrieben:Somit muss bei der Prüfung der Teilbarkeit mit 4 die Abfrage: if(wert & 3) lauten. Hat auch geklappt lt. meinem Terminal. Vorallem sieht man das da gut.
Dass Du das so ausprobierst, ist sehr gut. So sammelst Du Erfahrungen.
beginner123 hat geschrieben:Wo ich mir noch nicht 100%ig sicher bin, aber glaube es zu wissen ;-), die Teilbarkeitsprüfung mit dem binären Operator geht (zum. bei int) nur mit durch-2-teilbaren Zahlen (??). Denn alle tests mit wert & 2, wert & 4 usw...waren fehlerhaft, da ja nicht mehr im "Zweiersystem" gerechnet wird sondern eben - durch die zusätzliche, geforderte "Null" als Ergebnis - nicht mehr 1 Zeichen (:2) oder 2 Zeichen (:4) nach rechts gehe, sondern 3 Zeichen (: 3), also 1, 2, 0, was ja nicht geht(?). Dummerweise teilt mein TR ganz brav 1001/0011 = 0011 :? Na ja, kann aber auch sein, dass ich momentan den Wald vor lauter Bäumen nicht mehr sehe. Werd mich morgen damit weiterbeschäftigen.
& ist kein Teilen, sondern ein Wegschneiden von Bits, die im zweiten Operanden mit 0 gekennzeichnet sind.
1001 / 0011 = 0011 heißt 9 / 3 = 3.
1001 & 0011 = 0001 heißt für die einzelnen Bits: 1 && 0 => 0, 0 && 0 => 0, 0 && 1 => 0, 1 && 1 => 1.
beginner123 hat geschrieben:Würde mich freuen, zu hören, was ihr dazu meint, bzw. ob ich irgendwo noch einen Denkfehler oder was falsch beschrieben habe.

Danke euch nochmals, ihr habt mir wirklich weitergeholfen :-)!!
Das ist das Ziel der Website und des Forums.
Schön, wenn das Ziel erreicht wird. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten