Aufgabe zur Bitmanipulation



  • Hallo,

    Ich muss eine Aufgabe erledigen und da mir gerade einfach die Zeit fehlt, weil meine Tochter eine Magen-Darm-Infektion hat, wäre es wunderbar, wenn jemand diese für mich erledigen könnte. Ich zahle auch (PayPal, Paysafecard etc.)

    Der Benutzer soll eine beliebige ganze Zahl eingeben. Ihr Programm soll daran mit Hilfe
    der bitweisen Operatoren (bitte nicht die arithmetischen Operatoren nehmen) folgende
    Änderungen vornehmen:
    • Setzen Sie das letzte Bit in der Zahl auf 1 und geben Sie die erhaltene Zahl aus.
    • Setzen Sie das zweite Bit von rechts auf 0 und geben Sie die erhaltene Zahl aus.
    • Geben Sie das vierte Bit von rechts aus.
    • Invertieren Sie alle Bits im letzten Byte (die 8 Bit ganz rechts) der Zahl und geben
    Sie das Ergebnis aus.
    • Vertauschen Sie die letzten beiden Bits und geben Sie die erhaltene Zahl aus.
    Die anderen Bits sollen dabei jeweils nicht verändert werden. Bedenken Sie, dass die
    Datentypen nicht auf jedem System gleich viele Bits umfassen.

    Mit freudlichen Grüßen
    Klaus Malzbier



  • @KlausMalzbier Die ganzen Verhandlungen zwecks Zahlung und Übersendung der Aufgabe dauern länger als das Programm zu schreiben.


  • Mod

    Was @DirkB sagte. Aber da mir in der Mittagspause langweilig war, habe ich diesen Zehnzeiler einfach mal rausgehauen. Auch wenn ich nichts an der Geschichte glaube.

    #include <stdio.h>
    
    int main()
    {
      unsigned number;
      scanf("%u", &number);
      printf("Anfangswert: %u\n", number);
      printf("Letztes Bit auf 1: %u\n", number | 1);
      printf("Zweitletztes Bit auf 0: %u\n", number & ~(1U << 1));
      printf("Viertes Bit von Rechts: %u\n", (number >> 3) & 1);
      printf("Letztes Byte invertiert: %u\n", number ^ 255);
      unsigned x = ((number >> 1) ^ number) & 1;
      printf("Letzte zwei Bits vertauscht: %u\n", number ^ ( x << 1 | x ));
    }
    

    Wenn jemand eine clevere Idee hat, um den letzten Ausdruck auf eine schöne Form zu bringen (schön = ohne einfach 2x das x einzusetzen), wäre ich interessiert. Vielleicht kann man da was vereinfachen, wenn man weiß, dass es genau die letzten beiden Bits sind, wohingegen mein Ausdruck von meiner allgemeinen Denkweise kommt, wie ich ganz generell Bit X und Y vertauschen würde.

    PS: Den Sprung zwischen den ersten vier und der letzten Teilaufgabe fand ich extrem. Vielleicht soll dadurch getestet werden, wer sich helfen ließ, weil erwartet wird, dass keiner der Teilnehmer das alleine schafft 😛



  • printf("Letzte zwei Bits vertauscht: %u\n", (number & ~3) | (3 - (number & 3)) );

    edit: leider falsch 🤷♂


  • Mod

    Nee, das passt nicht. 4 (100) wird dabei zu 7 (111).



  • Ich finde die Formulierungen "links", "rechts", "letztes" bei Bits irgendwie schräg. Wie früher im Geographieunterricht wo der Lehrer gesagt hat "links", "rechts", "oben" und "unten" sind keine geeigneten Begriffe um auf einer Karte etwas zu beschreiben....


  • Mod

    Und doch war absolut niemand verwirrt. So wie auch nie jemand nachfragt, ob ich Einhundertdreiundzwanzig oder Dreihunderteinundzwanzig meine, wenn ich 123 schreibe.



  • @SeppJ sagte in Aufgabe zur Bitmanipulation:

    Und doch war absolut niemand verwirrt. So wie auch nie jemand nachfragt, ob ich Einhundertdreiundzwanzig oder Dreihunderteinundzwanzig meine, wenn ich 123 schreibe.

    Der Vorteil an "links" und "rechts" ist, dass man die Byte-Order absolut außen vor lassen kann, solange man nicht versucht zu interpretieren. 😉 Wenn man "höchstwertig" und "niederwertig" verwendet, sieht das schon wieder anders aus 😉



  • @SeppJ sagte in Aufgabe zur Bitmanipulation:

    Und doch war absolut niemand verwirrt.

    weil dir niemand zuhört ...


  • Mod

    @Swordfish sagte in Aufgabe zur Bitmanipulation:

    @SeppJ sagte in Aufgabe zur Bitmanipulation:

    Und doch war absolut niemand verwirrt.

    weil dir niemand zuhört ...

    Wieder Qualitätsmaterial, wie man es kennt.


Log in to reply