Forum: PC-Programmierung C, swapbits shiften


von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

> 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.

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

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
Noch kein Account? Hier anmelden.