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

Fermé
NitriK - 17 avril 2008 à 00:12
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 17 avril 2008 à 09:50
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 lundi 11 septembre 2006 Statut Membre Dernière intervention 31 mai 2011 29
17 avril 2008 à 00:57
Salut,

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

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

Merci Damlegone32 :)
0
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 vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
17 avril 2008 à 09:50
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