2017-06-20 5 views
1

J'appris des manipulations de bits alors j'ai pensé à ceci. Dites que j'ai deux nombres, Premier dans la gamme de [1,6] et deuxième dans la gamme de [0,3]. Maintenant, le premier nombre peut prendre jusqu'à 3 bits à stocker et le second peut prendre 2 bits à stocker. Comment puis-je utiliser un int32 pour y stocker les deux. Merci.Comment puis-je encoder et décoder deux nombres dans un seul entier en utilisant des manipulations de bits?

+0

[bit feilds] (http://fr.cppreference.com/w/cpp/language/bit_field) – NathanOliver

Répondre

2

le feraient. Occupe alors les deux bits les moins significatifs, et vous pouvez l'extraire avec composite & 3.

first_number occupe les trois bits à la "gauche" de cela, et vous pouvez l'extraire avec composite >> 2.

+0

Merci d'avance pour votre réponse. Est-il possible d'encoder plus de deux nombres? –

+1

Bien sûr que c'est. Vous utilisez simplement plus d'opérateurs au niveau du bit pour l'extraction. La réponse de @nglee généralise plus facilement. – Bathsheba

6

Encode:

// a : range of [1,6], bit0 ~ bit2 
// b : range of [0,3], bit3 ~ bit4 
// c : encoded int32 
c = 0; 
c |= (a | b << 3); 

Decode:

a = (c & 0x00000007); 
b = (c & 0x00000018) >> 3; 
+0

Avoir un upvote: votre code est plus professionnel que le mien, en particulier 'a | b << 3' qui est une pierre de touche pour la connaissance de la préséance de votre opérateur. – Bathsheba

+0

@Bathsheba Merci, mais j'ai aimé votre idée de multiplication et de division. (devinez qu'il est édité maintenant) Il a semblé plus simple que celui-ci. – nglee

+0

Voilà comment je pense à cela dans ma tête mais je pense que l'utilisation d'opérateurs bit à bit est un peu moins idiosyncratique. Votre réponse reste toujours supérieure puisque vous avez pris soin de la documenter. (Drôle comment nous avons mis les deux nombres dans des endroits différents.Est-ce que c'est comment la bataille d'endianness a commencé?) – Bathsheba

2

Si vous avez juste besoin de deux nombres emballés dans un seul entier, au lieu de manipulations de bits, vous pouvez utiliser un bit fields. De cette façon, vous pouvez stocker deux champs dans l'espace d'un champ int et y accéder par noms.

+0

J'essaie d'envoyer des données sur le réseau et Il doit être un int. J'ai quelques restrictions ici. Merci. –

+1

@Ankitsinghkushwah il peut prendre exactement la taille de valeur int de stockage, juste faire attention avec signé/unsigned. Vous pouvez le vérifier ici: http://cpp.sh/6q73k peut-être qu'il vous aidera une autre fois :) – Michael232

+0

Notez que la disposition des champs de bits est spécifique à l'implémentation. Il n'y a aucune exigence qu'une structure contenant deux petits champs doit tenir dans un 'int'. C'est ce qui est généralement fait, mais ce n'est pas garanti. –