mikrocontroller.net

Forum: PC-Programmierung C, swapbits shiften


Autor: Bob Hulu (Firma: hinter den 7 bergen) (bob128)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bob Hulu (Firma: hinter den 7 bergen) (bob128)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.