4Byte - ArraySort



  • Hey,

    ich habe ein array A[1024]. In diesem Array werden byteweise HEX-Zahlen gelistet. Nun würde ich gerne das Array in "vier-byte-schritten" invertieren (ähnlich l-endian to b-endian sort), sprich:

    Graphisch:
    Inhalt Array
    [ A | B | C | D | E | F | G | H |...] ==Sort==> [ D | C | B | A | H | G | F | E |...]

    Habt ihr da vielleicht eine Funktion oder einen Hinweis



  • for(i=0;i<1024;i+=4)
    {
       {
          char tmp=a[i+0];
          a[i+0]=a[i+3];
          a[i+3]=tmp;
       }
       {
          char tmp=a[i+1];
          a[i+1]=a[i+2];
          a[i+2]=tmp;
       }
    }
    


  • Baue eine Funktion, die dir ein Array von 4 Byte umdreht. Wende diese Funktion auf jeden 4-Byte-Block deines Arrays an. Beispielsweise*:

    void inv4byte(char* a)
    {
      char a0 = a[0];
      char a1 = a[1];
      char a2 = a[2];
      char a3 = a[3];
    
      a[0] = a3;
      a[1] = a2;
      a[2] = a1;
      a[3] = a0;
    }
    ... // benutzen
    char a[1024];
    for(int i = 0; i < 1024; i += 4)
      inv4byte(a+i);
    

    * auf die schnelle und ungetestet



  • Vielen Dank, funzt 🙂



  • knivil schrieb:

    Baue eine Funktion, die dir ein Array von 4 Byte umdreht. Wende diese Funktion auf jeden 4-Byte-Block deines Arrays an. Beispielsweise*:

    void inv4byte(char* a)
    {
      char a0 = a[0];
      char a1 = a[1];
      char a2 = a[2];
      char a3 = a[3];
    
      a[0] = a3;
      a[1] = a2;
      a[2] = a1;
      a[3] = a0;
    }
    ... // benutzen
    char a[1024];
    for(int i = 0; i < 1024; i += 4)
      inv4byte(a+i);
    

    * auf die schnelle und ungetestet

    Lahm.

    Denn bei großen Arrays ist für jedes 4 Byte ein Funktionsaufruf notwendig. 👎

    Besserer Vorschlag:
    Schreib eine Funktion, die ein Array als Parameter annimt, und ein Array zurückliefert, bei dem die Werte umgedreht sind.
    Das ist viel effizienter, weil so nur ein Funktionsaufruf notwendig ist.



  • Vorschlag schrieb:

    Lahm.

    Denn bei großen Arrays ist für jedes 4 Byte ein Funktionsaufruf notwendig. 👎

    Eigentlich falsch. Und zwar seit 20 Jahren schon. 😮

    Vorschlag schrieb:

    Besserer Vorschlag:
    Schreib eine Funktion, die ein Array als Parameter annimt, und ein Array zurückliefert, bei dem die Werte umgedreht sind.
    Das ist viel effizienter, weil so nur ein Funktionsaufruf notwendig ist.

    Ja, das war die Aufgabe. Bis auf die Rückgabe.



  • Man darf auch inline verwenden, was der Compiler wahrscheinlich sowieso macht.



  • Eine Frage noch, wenn ich vier Puffer mit je 1024Byte hätte und würde diese ebenfalls sequentiell durchlaufen wollen. Das geht ja mit einer if Abfrage, welchen Puffer man gerade bedient muss, aber kriegt man das auch mit einem Zeiger hin?

    bin schon am rumprobieren, kriegs aber nicht so ganz hin...habt ihr noch ne Idee?



  • volkard schrieb:

    Vorschlag schrieb:

    Lahm.

    Denn bei großen Arrays ist für jedes 4 Byte ein Funktionsaufruf notwendig. 👎

    Eigentlich falsch. Und zwar seit 20 Jahren schon. 😮

    Erläutere!

    Vorschlag schrieb:

    Besserer Vorschlag:
    Schreib eine Funktion, die ein Array als Parameter annimt, und ein Array zurückliefert, bei dem die Werte umgedreht sind.
    Das ist viel effizienter, weil so nur ein Funktionsaufruf notwendig ist.

    Ja, das war die Aufgabe. Bis auf die Rückgabe.[/quote]

    Ah, dann war knivils Beschreibung falsch, denn er schrieb:

    Wende diese Funktion auf jeden 4-Byte-Block deines Arrays an.



  • Vorschlag schrieb:

    volkard schrieb:

    Vorschlag schrieb:

    Lahm.

    Denn bei großen Arrays ist für jedes 4 Byte ein Funktionsaufruf notwendig. 👎

    Eigentlich falsch. Und zwar seit 20 Jahren schon. 😮

    Erläutere!

    inline

    Vorschlag schrieb:

    Besserer Vorschlag:
    Schreib eine Funktion, die ein Array als Parameter annimt, und ein Array zurückliefert, bei dem die Werte umgedreht sind.
    Das ist viel effizienter, weil so nur ein Funktionsaufruf notwendig ist.

    Ja, das war die Aufgabe. Bis auf die Rückgabe.[/quote]

    Ah, dann war knivils Beschreibung falsch, denn er schrieb:

    Wende diese Funktion auf jeden 4-Byte-Block deines Arrays an.

    [/quote]
    Und drumherum eine Funktion, das hat er niemals ausgeschlossen. Aber darum ging es auch nie.



  • Erläutere!

    Der Compiler sieht dass die Schleife 256 mal durchlaufen wird. Da die Funktion winzig ist, inlined er sie einfach.
    Der Bloat ist absolut minimal, sowas wird praktisch immer inlined, selbst wenn es nicht in einem Loop-Body ist.



  • SanDi3go schrieb:

    Inhalt Array
    [ A | B | C | D | E | F | G | H |...] ==Sort==> [ D | C | B | A | H | G | F | E |...]

    Du kannst htonl (POSIX,winsock für Windows) für little endian Systeme verwenden:

    http://ideone.com/zWTyZ


Anmelden zum Antworten