c übungsbeispiel



  • hallo! ich tu mir bei dem bsp ein wenig schwer das zu verstehen..
    zeile 18
    warum wird hier 0x geschrieben? bzw wird der wert 1234 als ganzes an die funktion (Z1) übergeben.
    in der schleife werden über sizeof 2 bytes von "n" durch die short variable aufgerufen und mit 8 multipliziert aber wie werden die einzelnen bits hier sozusagen "herasuextrahiert" damit die ausgegebn werden oder wird jede ziffer 1 2 3 4 extra aufgerufen?

    void printBits(const unsigned short n)
    	for (int i = 8 * sizeof(n) - 1; i >= 0; i--)
    	{
    		printf("%d", (n >> i & 1));  		// i-tes Bit ausgeben
    		if (i % 4 == 0 && i > 0)			// und nach 4 Bits
    		    printf(" ");				    // eine Leerstelle.
    	}
    	printf("\n");
    } 
    
    uint16_t swapBytes(uint16_t wert)
    {
    	return (wert >> 8) | (wert << 8);
    }
    
    int main() 
    {
    	printBits(0x1234);
    	printBits(swapBytes(0x1234));
    	printBits(0x12);
    	printBits(swapBytes(0x12));
    	return 0;
    }
    


  • 0x bedeutet, daß die nachfolgenden Ziffern als hexadezimaler Wert zu interpretieren sind, d.h. 0x1234 = 4660 (dezimal).
    Und bei einer 0 als alleiniger Prefix wird dieser als oktal interpretiert.

    s.a. Informatik-Grundlagenwissen: Zahlensysteme

    Und das Extrahieren der Bits passiert bei n >> i & 1 über den Bitverschiebeoperator >> und das logische-Und & (Maskierungsoperator), s.a. Operatoren (s. Tabelle) bzw. etwas genauer z.B. in Bitmanipulation.


  • Mod

    @razor sagte in c übungsbeispiel:

    bzw wird der wert 1234 als ganzes an die funktion (Z1) übergeben.

    Klar. Wie sonst?

    in der schleife werden über sizeof 2 bytes von "n" durch die short variable aufgerufen und mit 8 multipliziert aber wie werden die einzelnen bits hier sozusagen "herasuextrahiert" damit die ausgegebn werden oder wird jede ziffer 1 2 3 4 extra aufgerufen?

    Wenn du irgendeine Zahl hast, beispielsweise 76, und schreibst das mal binär hin: 01001100
    Jetzt willst du beispielsweise das dritte Bit von rechts wissen (in deinem Programm i=2, weil wir bei 0 anfangen, das erste Bit von rechts wäre also i=0). Dazu verschiebst du die Binärdarstellung um i=2 Stellen nach rechts (in deinem Programm das n >> i). Kommt raus 00010011 (die beiden Stellen, die rechts raus gerutscht sind, gibt's nicht mehr).
    Jetzt steht das Bit, an dem du interessiert bist, an der Stelle ganz rechts, aber du musst noch rausfinden, ob es eine 0 oder eine 1 ist. Du musst also alles links davon wegwerfen. Dazu maskierst du es mit der Zahl 1 (in deinem Programm & 1). Beim Maskieren bleiben genau die Bits der Maske unverändert, und alles andere wird 0. Wenn du nur genau mit 1 maskierst (Binärdarstellung 00000001) bleibt also genau das rechteste Bit unverändert, alles andere wird 0. Im Beispiel bleibt also 00000001 == 1. Und das ist dann der Wert des dritten Bits von rechts.


Log in to reply