Concaténer des nombres binaires de différentes longueurs
J'ai donc 3 numéros. L'un est un char
, et les deux autres sont int16_t
(aussi connu comme short
s, mais d'après un tableau que j'ai trouvé shorts de ne pas être fiable 16 bits).
Je voudrais concaténer ensemble. Donc, dire que les valeurs d'entre eux ont été:
10010001
1111111111111101
1001011010110101
J'aimerais terminer avec une long long
contenant:
1001000111111111111111011001011010110101000000000000000000000000
À l'aide de quelques solutions que j'ai trouvé en ligne, j'ai trouvé ceci:
long long result;
result = num1;
result = (result << 8) | num2;
result = (result << 24) | num3;
Mais ça ne fonctionne pas, il me donne très numéros impairs quand il est décodé.
Dans le cas où il y a un problème avec mon décodage de code, le voici: c'est
char num1 = num & 0xff;
int16_t num2 = num << 8 & 0xffff;
int16_t num3 = num << 24 & 0xffff;
Ce qui se passe ici? Je soupçonne que cela a à voir avec la taille d'une long long
, mais je n'arrive pas à envelopper ma tête autour d'elle et je veux plus de place pour les numéros plus tard.
Vous devez vous connecter pour publier un commentaire.
Pour obtenir la bonne bit-modèle comme vous l'avez demandé, vous devriez utiliser:
Cela donnera l'exact modèle de bits que vous avez demandé, 24 bits à la lsb-end à gauche 0:
Que la dernière maj, vous devriez être en train de changer de 16, pas de 24. 24 est la longueur actuelle de votre chaîne binaire, après la combinaison de num1 et num2. Vous devez faire de la place pour num3, qui est de 16 bits, donc maj gauche par 16.
Edit:
Viens de réaliser le premier quart est aussi une mauvaise. 16 aussi, pour les mêmes raisons.
Oui, vous êtes, débordement de la valeur qui peut être stockée dans de long. Vous pouvez utiliser un arbitraire precison bibliothèque pour stocker le grand nombre comme le GMP.
long long
, paslong
.long long
peut stocker au moins 64 bits, il n'a besoin que de 40.Si je comprends bien ce que vous faites, je voudrais utiliser:
La touche maj gauche lors de la construction est par la largeur de la prochaine nombre à insérer. Le décalage à droite sur l'extraction est assurée par le nombre total de bits, le champ a été laissé déplacé lors de la construction.
J'ai testé le code ci-dessus. long long est assez large pour cette tâche avec le compilateur g++, et je crois que beaucoup d'autres.