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); }
3 Réponses :
int code>, vous souhaitez probablement utiliser non signé long long int code> pour ce ou uint64_t code> la taille de l'INT n'est pas spécifié dans le C Standard. Li>
- 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. Li>
- Pourquoi les utilisez-vous comme des pointeurs? Cela semble sans rapport avec la question que vous demandez ici. LI>
ol>
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
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?
Votre fonction (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 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.
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);
}
@teolaferla Si c'est ce dont vous avez besoin, vous pouvez accepter la réponse.
Eh bien, vous semblez avoir 6 bits significatifs, de sorte que vous devriez probablement rester à gauche par 6 et 12, respectivement.
Si
B1 code> et
B2 code> sont supposés avoir 6 bits chacun de chacun, vous devriez utiliser
(B3 << 12) | (B2 << 6) | B1 code>. Veuillez également afficher les déclarations de
B1 code>,
b2 code>,
b3 code>.
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 code>,
b2 code> et
b3 code>. Vous les utilisez comme des pointeurs, vous pourriez même avoir un comportement indéfini. Nous ne savons pas sans voir le code manquant.