Bits zählen optimieren



  • Hallo zusammen,

    in der folgenden Routine zähle ich die "gesetzten" Bits eines 4-Plane-Rasterfiles indem ich mir Byte für Byte anschaue und per LeftShift jedes Bit auf gesetzt oder nicht prüfe. Allerdings kostet mich diese Routine bei großen Dateien sehr viel Zeit, und meine Frage an Euch, kann ich hier noch etwas optimieren oder umstricken um das ganze schneller zu machen ?
    BMP_Color[] ist ein BYTE Array.

    for (plane=0; plane < 4; plane++)
              {
               for (n=0; n < ymax; n++)
                  {
                   switch ( plane )
                     {
                      case 0:
                             for ( i = 1; i <= 128; i <<= 1 )
                                {
                                 if ( BMP_Black[n] & i ) K_pix++;
                                }
                             break;
                      case 1:
                             for ( i = 1; i <= 128; i <<= 1 )
                                {
                                 if ( BMP_Cyan[n] & i ) C_pix++;
                                }
                             break;
                      case 2:
                             for ( i = 1; i <= 128; i <<= 1 )
                                {
                                 if ( BMP_Magenta[n] & i ) M_pix++;
                                }
                             break;
                      case 3:
                             for ( i = 1; i <= 128; i <<= 1 )
                                {
                                 if ( BMP_Yellow[n] & i ) Y_pix++;
                                }
                             break;
                     }
                  }
              }
    

    Vielen Dank im Voraus und Gruß

    WoWe



  • Shiften vergessen und stattdessen Bitmasken benutzen 🕶



  • statt

    for ( i = 1; i <= 128; i <<= 1 )
    {
       if ( BMP_Yellow[n] & i ) Y_pix++;
    }
    

    lieber

    Y_pix=bitcount[BMP_Yellow[n]];
    

    und ein 256 byte großes array, was zu jedem index sagt, wieviele bits er hat.



  • @Volkard:
    Vielen Dank für Deinen Tip. Mit dieser Methode ist meine Routine gut 50% schneller geworden.

    @etechniker:
    Das mit den Bitmasken habe ich noch nicht verstanden. Entweder habe ich 8 verschiedene Bitmasken die ich nacheinander laden muß oder ich habe eine Maske und muß die dann Shiften, oder 😕



  • Original erstellt von WoWe:
    Entweder habe ich 8 verschiedene Bitmasken die ich nacheinander laden muß oder ich habe eine Maske und muß die dann Shiften, oder 😕

    Korrekt. Oder du machst es über eine Wertematrix (wie Volkard ja vorgeschlagen hat) Da dann das Bitweise Prüfen wegfällt ist die Geschwindigkeitsverbesserung druchaus realistisch.

    -junix



  • schau mal auf snippets.org unter bit-operations 🙂



  • Hallo Tendor,

    hast du mal einen direkten link dahin ? Unter www.snippets.org hab ich nichts wie bit-operations gefunden.

    Gruß WoWe



  • Ok, hab's gefunden. Danke nochmals.

    Gruß WoWe


Anmelden zum Antworten