0
votes

Comment combiner 3 données binaires en C?

J'essaie de combiner des séquences de bits suivantes dans une variable, puis je vais la tourner en une décimale.

int *get_bits(int n, int bitswanted){
  int *bits = malloc(sizeof(int) * bitswanted);

  int k;
  for(k=0; k<bitswanted; k++){
    int mask =  1 << k;
    int masked_n = n & mask;
    int thebit = masked_n >> k;
    bits[k] = thebit;
  }

  return bits;
}

int main()
{
    long r=0b0010110100111110000010110110101010000001;
    int i;
    int byte1,byte2,byte3,byte4,byte5;
    //int *Lbits,*Mbits,*Hbits;
    int bw6=6,bw4=4;

    byte1 = (r>>32) & 0xFF;
    byte2 = (r>>24) & 0xFF;
    byte3 = (r>>16) & 0xFF;
    byte4 = (r>>8) & 0xFF;
    byte5 = (r>>0) & 0xFF;

   int *Lbits=get_bits(byte3,bw6);
   int *Mbits=get_bits(byte4,bw6);
   int *Hbits=get_bits(byte5,bw4);

   int combine=(Hbits<<12)|(&Mbits<<6)|Lbits;



  for(i=bw6-1; i>=0;i--)
  {
    printf("%d", Lbits[i]);
  }
  printf("\n");

  for(i=bw6-1; i>=0;i--)
  {
    printf("%d", Mbits[i]);
  }
  printf("\n");

  for(i=bw4-1; i>=0;i--)
  {
    printf("%d", Hbits[i]);
  }
  printf("\n");

  printf("%d",combine);
}


4 commentaires

Eh bien, vous semblez avoir 6 bits significatifs, de sorte que vous devriez probablement rester à gauche par 6 et 12, respectivement.


Si B1 et B2 sont supposés avoir 6 bits chacun de chacun, vous devriez utiliser (B3 << 12) | (B2 << 6) | B1 . Veuillez également afficher les déclarations de B1 , b2 , b3 .


Si vous voulez dire que vous voulez une combinaison = (* b1 << 12) | (* B2 << 6) | * B3; J'ai essayé le même résultat; 4097.


Vous n'avez toujours pas montré la déclaration de B1 , b2 et b3 . Vous les utilisez comme des pointeurs, vous pourriez même avoir un comportement indéfini. Nous ne savons pas sans voir le code manquant.


3 Réponses :


0
votes
  1. Vous changez trop, vous finissez par quitter les zéros entre vos numéros
  2. n'utilise pas int , vous souhaitez probablement utiliser non signé long long int pour ce ou uint64_t la taille de l'INT n'est pas spécifié dans le C Standard.
  3. J'ai essayé d'exécuter votre code en python et il se produit 763905 pour moi, vous pourriez avoir d'autres bugs qui ne sont pas présentés ici.
  4. Pourquoi les utilisez-vous comme des pointeurs? Cela semble sans rapport avec la question que vous demandez ici.

0 commentaires

0
votes

Ainsi, lorsque BR3 est MSB, il devrait être:

int combine=(*b3<<12)|(*b2<<6)|*b1;


  0b0001     (1d)  * 4096  (12 left shift)  = 4096
 +0b101010   (42d) *   64  (6 left shift)   = 2688
 +0b001011   (11d) *    1                   =   11
  _________________________________________________
                                               6795


1 commentaires

Je suis désolé de ne pas avoir pu comprendre comment vous avez calculé 6795. Printf ("% D", combine) donne 4097. Est-ce que je fais quelque chose de mal?



0
votes

Votre fonction get_bits code> ne renvoie pas de int code> ou similaire que vous pouvez combiner par bit changeant et bitwise ou. Il renvoie un tableau int code> où chaque élément contient la valeur d'un seul bit.

(Il serait possible de combiner les données de ces tableaux selon les besoins en traitant les bits un par un, mais ce concept dispose d'autres pièges car vous devriez vous assurer de ne pas accéder à la mémoire de la mémoire dynamique. .) p>

Voici une version modifiée de votre programme qui fonctionne avec non signé INT code> au lieu de int code> réseaux. P>

#include <stdio.h>

unsigned int get_bits(unsigned int n, int bitswanted){
    return n & ((1<<bitswanted)-1);
}

int main()
{
    unsigned long r=0b0010110100111110000010110110101010000001;
    int i;
    int byte1,byte2,byte3,byte4,byte5;

    int bw6=6,bw4=4;

    byte1 = (r>>32) & 0xFF;
    byte2 = (r>>24) & 0xFF;
    byte3 = (r>>16) & 0xFF;
    byte4 = (r>>8) & 0xFF;
    byte5 = (r>>0) & 0xFF;

   int Lbits=get_bits(byte3,bw6);
   int Mbits=get_bits(byte4,bw6);
   int Hbits=get_bits(byte5,bw4);

   int combine=(Hbits<<12)|(Mbits<<6)|Lbits;

   printf("%d\n",combine);
}


1 commentaires

@teolaferla Si c'est ce dont vous avez besoin, vous pouvez accepter la réponse.