11
votes

Manière optimale d'effectuer une opération de décalage sur un tableau

Supposons que j'ai un tableau

unsigned char arr[]= {0,1,2,3,4,5,6,7,8,9};

c c++

4 commentaires

Qu'essayez-vous d'accomplir, dupliquer le tableau?


Peut-être que c'est juste moi, mais je suis un peu incertain - Voulez-vous changer de bitwise chaque élément dans la matrice ou sur la circulaire de l'ensemble de la matrice?


Vous déplaçez les éléments le tableau, c'est-à-dire Array [0] = arr [1], etc., ou êtes-vous bossez-vous chaque élément de la matrice, c'est-à-dire Arr [0] = arr [0] << 2? Si le premier, supprimez l'étiquette "Bitwise".


@Andy: essayer d'obtenir un changement circulaire


6 Réponses :


7
votes

Si vous êtes la seule personne avec un pointeur sur le tableau, incrémentez simplement le pointeur et décrémentez la longueur.

N'oubliez pas de garder le pointeur d'origine pour le moment où vous le libérez.


0 commentaires

9
votes

Tant que le tableau est modifiable, vous pouvez utiliser MemMove pour les déplacer (mais n'utilisez pas à tort memcpy comme MemCy n'est pas destiné aux régions qui se chevauchent): xxx

(taille de ARR) - Tailleof (* Ar) est la taille des octets de tous les éléments sauf 1 de la matrice).


1 commentaires

Cela perd complètement la valeur de arr [0] - Pour un décalage circulaire, vous devez enregistrer cette valeur et le stocker dans le dernier élément après le Memmove .



0
votes

Je me demande si vous devriez peut-être utiliser un STD :: Valarray.


0 commentaires

20
votes

Si vous voulez un décalage circulaire des éléments: xxx

... fera le tour. Vous aurez besoin de #incluez l'en-tête d'algorithme.


0 commentaires

1
votes

Si vous voulez vraiment que la vitesse flamboyante, regardez le décalage de l'assembleur avec des opérations de transport. http://fr.wikibooks.org/wiki/x86_assembly/shift_and_rotate#shift_with_carry_instructions Couplé avec une boucle que vous pouvez bit-shirt un tableau en millisecondes.


0 commentaires

7
votes

Si vous recherchez une solution pure C, voici, y compris un programme de pilotes. Il s'avère assez simple: tournez par n , vous:

  1. Inverser le premier N éléments in-place,
  2. inverser les éléments restants dans la place et
  3. inverser toute la matrice en place.

    Cela nécessite un élément de stockage supplémentaire (pour l'inversion). xxx


0 commentaires