C #, bits & amp; bytes - Comment récupérer des valeurs de bits à partir d'un octet?
Je suis en train de lire certaines valeurs à partir d'un seul octet. Je me suis dit dans le manuel manuel que ce soit un octet contient 3 valeurs différentes. Il y a une table qui ressemble à ceci:
J'interprète qui a un sens de la précision prend 3 bits, échelle prend 2 et taille 3 pour un total de 8 (1 octet).
Ce que je ne suis pas clair:
1 - Pourquoi est-il marqué 7 à 0 au lieu de 0 à 7 (quelque chose à voir avec la signification peut-être?)
2 - Comment puis-je extraire les différentes valeurs d'un octet?
source d'informationauteur bugfixr
Vous devez vous connecter pour publier un commentaire.
Il est de coutume de nombre de bits dans un octet en fonction de leur importance: peu
x
représente2^x
. Selon ce schéma de numérotation, le bit le moins significatif obtient le numéro zéro, le bit suivant est le numéro un, et ainsi de suite.Obtenir des bits individuels nécessite un changement et un masquage de l'opération:
Maj par le nombre de bits vers la droite de l'extrême droite de la portion que vous avez besoin pour obtenir (décalage par zéro est ignoré; je l'ai ajouté à des fins d'illustration).
Masque avec le plus grand nombre qui correspond au nombre de bits que vous souhaitez obtenir: 1 pour un peu, 3 pour les deux bits, 7 pour les trois bits,
2^x-1
pourx
bits.Vous pouvez faire des changements et des masques, ou vous pouvez utiliser le BitArray classe: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx
Exemple avec BitVector32:
LINQPad de sortie:
Potayto, potahto.
Vous souhaitez utiliser des décalages et des masques à aplatir les indésirables bits, comme tel:
1. Oui, le bit le plus significatif est généralement écrit en premier. Le plus à gauche est peu marqué 7, parce que lorsque l'octet est interprété comme un entier, ce bit a la valeur 27 (= 128) lorsqu'il est réglé.
C'est tout à fait naturel et est en fait exactement la même que la façon dont vous écrivez les nombres décimaux (chiffres plus importantes en premier). Par exemple, le nombre de 356 est (3 x 102) + (5 x 101) + (6 x 100).
2. Pour la réalisation, comme mentionné dans d'autres réponses, vous pouvez extraire les différentes valeurs en utilisant le décalage de bits et au niveau du bit et les opérateurs comme suit:
Note importante: ceci suppose que les valeurs individuelles doivent être interprétés comme entiers positifs. Si les valeurs peuvent être négatives alors cela ne fonctionnera pas correctement. Étant donné les noms de vos variables, ce qui est peu probable d'être un problème ici.
Vous pouvez le faire via le bit à bit de l'arithmétique: