Es funktioniert... aber warum?



  • Hallo liebes Forum,

    nachfolgend sind einige Bit-Drehereien zu sehen. Das Ergebnis, nämlich die Bildung eines Bitstromes, ist mir schon klar. Jedoch kann ich den Ausdruck des fremden Codestücks nicht interpretieren. Im Speziellen meine ich den Inhalt der for-Schleife.

    /*************************************************************************
    * _Huffman_WriteBits() - Write bits to a bitstream.
    *************************************************************************/
    
    static void _Huffman_WriteBits( huff_bitstream_t *stream, unsigned int x,
      unsigned int bits )
    {
      unsigned int  bit, count;
      unsigned char *buf;
      unsigned int  mask;
    
      /* Get current stream state */
      buf = stream->BytePtr;
      bit = stream->BitPos;
    
      /* Append bits */ // Hier fängt es an unleserlich zu werden!!!
      mask = 1 << (bits-1);
      for( count = 0; count < bits; ++ count )
      {
        *buf = (*buf & (0xff^(1<<(7-bit)))) +
                ((x & mask ? 1 : 0) << (7-bit));
        x <<= 1;
        bit = (bit+1) & 7;
        if( !bit )
        {
          ++ buf;
        }
      }
    
      /* Store new stream state */
      stream->BytePtr = buf;
      stream->BitPos  = bit;
    }
    

    Vielen Dank!



  • "0xFF^(1<<x)" setzt das Bit an Position x auf 0 und alle übrigen auf 1, "((x&mask?1:0)<<(x))" setzt bit x entweder auf 1 oder 0, die übrigen Bits auf 0. Durch die Addition wird also das Bit "7-bit" kontrolliert auf 0 bzw. 1 gesetzt.

    (und "bit=(bit+1)&7;" ist äquivalent zu "bit=(bit+1)%8;" (das funktioniert übrigens nur für Zweierpotenzen))



  • Wenn euch das schon verwirt, dann seht euch das mal an:

    #include <ctime>
    #include <iostream>
    int a[1817];
    int main(int z, int p, int q, int r) {
        for(p = 80; q+p-80; p-=2*a[p])
            for(z=9; z--; )
                q = 3 & (r = time(0)+r*57) / 7 , q = q ? q-1 ? q-2?1- p %79 ? -1 : 0 : p % 79-77 ? 1
                : 0 : p < 1659 ? 79 : 0 : p > 158 ? - 79 : 0, q ? !a[p+q*2] ? a[p+=a[p+=q]=q]=q : 0 :0;
            for(; q++-1817; )
                printf(q % 79 ? "%c" : "%c\n", " #"[!a[q-1]]);
        system("pause");
    }
    

    (Dieses Programm wurde nicht von mir geschrieben, es hat irgend wann einmal einen Wettbewerb gewonnen, der hieß glaube ich: "Wer schreibt das verrückteste C Programm?")
    Testet es mal 🙂 (Ich hab`s etwas umschreiben müssen damit es läuft)

    Gruß LukasBanana



  • LukasBanana schrieb:

    (Dieses Programm wurde nicht von mir geschrieben, es hat irgend wann einmal einen Wettbewerb gewonnen, der hieß glaube ich: "Wer schreibt das verrückteste C Programm?")

    Meinst du The International Obfuscated C Code Contest?



  • JA! Das klingt als währe es das Richtige! 🙂


Anmelden zum Antworten