[C] Copie d'un tableau dans un unique integer

NitriK -  
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous !

Pour une application en C embarqué, je voudrais recopier les valeurs binaires d'un tableau dans un long.

Par exemple si
tab[]={0,0,1,0,0,0,1,0,1,0} je voudrais:
tableau_copie = 0b(00)10001010, soit 138 en décimal.

Voici mon code:

tableau_copie = 0;
for(i=0;i<10 ;i++)
{
     tableau_copie = (( tableau_copie ) + (tab[i] << (i) )) ;
}


Avec ce code j'obtiens 01000100, c'est à dire 68, au lieu de 138.

Je bloque la dessus depuis plusieurs heures.
La réponse est peut être évidente, mais j'avoue ne plus rien voir...

Une idée ? :)

Nitrik
A voir également:

2 réponses

damlegone32 Messages postés 74 Date d'inscription   Statut Membre Dernière intervention   29
 
Salut,

Le poids fort est le premier élément du tableau donc :
tableau_copie = tableau_copie + ((tab[i])<<(9-i));

A+
1
nitrik
 
Test positif, c'était aussi simple que cela.

Merci Damlegone32 :)
0
ROM++
 
d'abord, ta condition de boucle est <10, donc ta boucle n'arrive jamais a la fin de tableau
et puis pourquoi tu ajoutes i a tab[i] ?
i c'est juste ton compteur non? tu as toute une serie de chiffres qui proviennent du compteur qui sont additionnes avec ton tableau

je suis pas tres sur, mais je pense que c'est ca

essaie avec une autre valeur
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
ta remarque est fausse. i allant de 0 à 9, ça fait bien 10 terme, de plus, << signifie décalage en bit et pas un ajout.
un truc un peu plus tordu aurai été de faire (juste pour le fun) :
struct champ{
  unsigned flood : 6; //pour compléter la structure afin qu'elle est la bonne taille de 16 bits (ou 2 octets), soit un short
  unsigned bin0 : 1;
  unsigned bin1 : 1;
  unsigned bin2 : 1;
  unsigned bin3 : 1;
  unsigned bin4 : 1;
  unsigned bin5 : 1;
  unsigned bin6 : 1;
  unsigned bin7 : 1;
  unsigned bin8 : 1;
  unsigned bin9 : 1;
}
champ.flood=0;
champ.bin0=tab[0];
champ.bin1=tab[1];
...
long entier_tot=*( (short*)&champ); 

Mais c'est moins élégant car les types utilisé dépendent de l'implémentation.
0