2012-11-04 3 views
5

J'ai donc 3 nombres. L'un est un char, et les deux autres sont int16_t (également connu sous le nom short s, mais selon un tableau, j'ai trouvé que les courts métrages ne seront pas fiables 16 bits).Concaténer des nombres binaires de différentes longueurs

J'aimerais les concaténer ensemble. Donc, dire que les valeurs d'entre eux étaient:

10010001

1111111111111101

1001011010110101

Je voudrais terminer avec un long long contenant:

1001000111111111111111011001011010110101000000000000000000000000

aide quelques solutions que j'ai trouvées en ligne, je c ame up avec ceci:

long long result; 
result = num1; 
result = (result << 8) | num2; 
result = (result << 24) | num3; 

Mais cela ne fonctionne pas; cela me donne des chiffres très étranges quand il est décodé.

En cas il y a un problème avec mon code de décodage, la voici:

char num1 = num & 0xff; 
int16_t num2 = num << 8 & 0xffff; 
int16_t num3 = num << 24 & 0xffff; 

Qu'est-ce qui se passe ici? Je soupçonne que cela a à voir avec la taille d'un long long, mais je ne peux pas tout à fait enrouler ma tête autour et je veux de la place pour plus de numéros plus tard.

Répondre

6

Pour obtenir le bit modèle correct que vous avez demandé, vous shoud utiliser:

result = num1; 
result = (result << 16) | num2; 
result = (result << 16) | num3; 
result<<=24; 

Cela donnera le motif binaire exact que vous avez demandé, 24 bits au lsb-extrémité gauche 0:

1001000111111111111111011001011010110101000000000000000000000000 
3

Pour ce dernier quart, vous ne devriez changer que 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 16 bits, donc décalage vers la gauche par 16

Edit:

vient de réaliser le premier changement est faux aussi. Cela devrait également être le cas pour des raisons similaires.

1

Oui, vous débordez la valeur qui peut être stockée longtemps. Vous pouvez utiliser une bibliothèque de précison arbitraire pour stocker le grand nombre comme GMP.

+0

Je vais examiner cela, mais je pourrais penser à une approche différente (mettre les chiffres sur la droite au lieu de la gauche?) Parce que les nombres simples sont les plus rapides. – Cheezey

+0

Il utilise 'long long', pas' long'. 'long long' peut stocker au moins 64 bits, il n'en a besoin que de 40. –

0

Si je comprends bien ce que vous faites, je l'utilise:

result = num1; 
result = (result << 16) | num2; 
result = (result << 16) | num3; 

num1out = (result >> 32) & 0xff; 
num2out = (result >> 16) & 0xffff; 
num3out = result & 0xffff; 

Le déplacement vers la gauche lors de la construction est la largeur du numéro suivant à insérer. Le bon décalage à l'extraction est le nombre total de bits que le champ a été laissé déplacé pendant la construction.

J'ai testé le code ci-dessus. long long est assez large pour cette tâche avec le compilateur g ++, et j'en crois beaucoup d'autres.

Questions connexes