2010-10-24 15 views
0

J'ai un flux de 16 bits, et j'ai besoin d'ajuster les 4 bits les moins significatifs de chaque échantillon. Les nouvelles valeurs sont différentes pour chaque short, mais répétez chaque short X - marquant essentiellement chaque short avec un ID.Méthode la plus efficace pour modifier un flux de données

Y a-t-il des astuces pour faire cela plus rapidement qu'une simple boucle?

Plus de détails Je convertis un fichier d'un format à un autre. Actuellement implémenté avec FILE * mais je pourrais utiliser des API spécifiques à Windows si utile.

[while data remaining] 
{ 
    read X shorts from input 
    tag 4 LSB's 
    write modified data to output 
} 

Outre les opérations en vrac, je suppose que je cherchais avis sur la meilleure façon de taper du pied ces 4 derniers bits.

  1. Décalage à droite 4, décalage à gauche 4, | dans les nouvelles valeurs
  2. & dans mes bits zéro, puis | dans les 1 bits
  3. module 16, ajouter une nouvelle valeur

Nous ne win7 de support (32 ou 64) en ce moment, donc le matériel serait tout ce que les gens choisissent pour cela.

+0

Par "flux", vous voulez dire "std :: istream", n'est-ce pas? –

+0

Pouvez-vous donner quelques détails? – ruslik

+0

J'espère que cela répond à vos questions, Billy et ruslik. – Thomas

Répondre

0

La meilleure façon de taper du pied ces 4 derniers bits est votre option 2:

int i; 
i &= 0xFFF0; 
i |= tag; 

Faire cela sur une longue serait plus rapide si vous connaissez des valeurs de variables à l'avance. Vous pouvez memcpy 4 courts métrages dans une longue puis effectuez les mêmes opérations que ci-dessus sur 4 courts métrages à la fois:

long l; 
l &= 0xFFF0FFF0FFF0FFF0; 
l |= tags; 

tags = (long) tag1 << 48 + (long) tag2 << 32 + (long) tag3 << 16 + (long) tag4; Cela a de sens que si vous réutilisez cette balises de valeur souvent, pas si vous avez pour le construire différemment pour chaque ensemble de 4 courts métrages.

+0

C'est ce que je commençais à me sentir le plus à l'aise, merci pour cette longue suggestion. Et mes étiquettes se répètent, ainsi la pré-construction fonctionnera bien. Marquer comme réponse jusqu'à ce que quelqu'un apporte une réfutation. Merci! – Thomas

3

Si vous travaillez par ex. une plate-forme 32 bits, vous pouvez les faire 2 à la fois. Ou sur un équivalent x86 moderne, vous pouvez utiliser les instructions SIMD pour fonctionner sur 128 bits à la fois. À part cela, il n'y a pas de méthodes de manipulation des bits pour éviter de boucler tout votre jeu de données, étant donné qu'il semble que vous deviez modifier chaque élément!

+1

Essayez simplement d'éviter les branches (et en particulier celles qui dépendent des données lues) dans la boucle. – ruslik

+0

Lisez autant de fichiers de données que vous le pouvez en mémoire, ou utilisez quelque chose qui les met en mémoire tampon (ce que supposerait ifstream). –

+0

Est-ce que travailler sur int * serait vraiment plus rapide que de travailler sur un short * pour le même bloc de données? – Thomas