Hi, ich hänge grad bei einer C-Programmier Aufgabe von einem Übungsbuch es geht ums Verständnis folgender Code: /* Swapbits.c --> Die Funktion swapbits() vertauscht in einem * * int-Wert zwei Bits. * * Argumente: Der int-Wert und zwei Bit-Nummern. * * Return-Wert: Der neue int-Wert. */ int swapbits(int x, int bitnr1, int bitnr2) // In x zwei Bits { // vertauschen. int newx, mask1, mask2; int msb = 8 * sizeof(int) - 1; // Hoechste Bit-Nummer if( bitnr1 < 0 || bitnr1 > msb || bitnr2 < 0 || bitnr2 > msb) return x; // Keine Aktion, falls ungueltige Bit-Nr. mask1 = (1 << bitnr1); // 1 in die Position bitnr1 mask2 = (1 << bitnr2); // 1 in die Position bitnr2 newx = x & ~(mask1 | mask2); // Beide Bits loeschen. if( x & mask1 ) newx |= mask2; // Bits tauschen if( x & mask2 ) newx |= mask1; return( newx); } Also hier mal von Hand versucht nachzuvollziehen was passiert mit beispielwerten : z.B. bitnr1=3 und bitnr2=5 mask1= 0000 0000 0000 0100 mask2= 0000 0000 0010 0000 | --------------------------------------- 0000 0000 0010 0100 (Klammer) ~1111 1111 1101 1011 x 0000 0000 0000 0011 (z.b.3) & ---------------------------------------- newx 0000 0000 0000 0011 if( x & mask1) => 0000 0000 0000 0011 &0000 0000 0000 0100 ---------------------------------- 0000 0000 0000 0000 wie ihr seht kann irgendwas nicht stimmen denn es kommt 0 raus auch mit if( x & mask2) kommt 0 raus und so wie ich das verstehe is die bedingung nur erfüllt wenn 1 rauskommen würde oder lieg ich da falsch? wenn wenigstens eine der if bed. wahr wäre würden die bits vertauscht werden hoffe jemand weiß woran es liegt, auch der beispiel wert für x ist ja noch im zulässigen bereich.
> if( x & mask1) => 0000 0000 0000 0011 > &0000 0000 0000 0100 > ---------------------------------- > 0000 0000 0000 0000 > > wie ihr seht kann irgendwas nicht stimmen denn es kommt 0 raus Warum? Das sollte doch hier auch rauskommen. > auch mit if( x & mask2) kommt 0 raus und so wie ich das verstehe is > die bedingung nur erfüllt wenn 1 rauskommen würde oder lieg ich da > falsch? Du liegst richtig. Da keins der beiden Bits vorher gesetzt war, ist auch nacher keines der beiden Bits gesetzt. Das Vertauschen zweier Nullen ergibt nämlich einfach nur wieder zwei Nullen. > wenn wenigstens eine der if bed. wahr wäre würden die bits > vertauscht werden Der Code, der bei wahrer Bedingung ausgeführt wird, dient nicht dazu, Bits zu tauschen, sondern zu setzen. Wenn Bit nr1 vorher gesetzt war, wird Bit nr2 gesetzt, und umgekehrt. Da davor beide gelöscht werden, entspricht alles zusammen einem Austausch der Bits.
ich bin der held vom erdbeerfeld :-) natürlich kommt beides mal 0 raus aaaaaaaaaaaaaaaaaaaaaa ich könnte mir in den arsch beißen das ich sowas offensichtliches übersehen habe ok thx PS: mir is grad noch ein kleiner fehler aufgefallen mask1 ist falsch zumindest binär die 1 gehört an bit 4 und nicht an bit 3 gesetzt
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.