Obtenir le bit le plus significatif à partir d'une valeur de 8 bits
Je sais qu'il y a des questions similaires sur ce site, cependant, je n'arrivais pas à trouver quelque chose qui a vraiment aidé à m'en sortir avec la question que je vais avoir.
Jusqu'à présent:
J'ai 1 octet (8 bits) qui pourrait être n'importe quelle combinaison de 1 et de 0.
Ex: 11000010 est mon octet de données. (Little-Endian)
Ce dont j'ai besoin à faire est de déterminer si le Bit le Plus Significatif (MSB), dans ce cas, les 11, est soit un 00, 01, 10, 11, et à partir de là faire d'autres choses.
J'ai jusqu'à présent eu le programme de sortie de l'Octet comme 11000010 (stockées dans une chaîne de caractères) et suis en train d'extraire le 11 de ce. (Si je peux comprendre ça, puis la création d'un interrupteur cas ou si l'instruction pour vérifier que le contenu est assez simple sur mon propre).
**Je n'ai pas été si bon avec le C++ c'est pourquoi je vous demande de l'aide.
Toute aide est grandement appréciée.
- Comment à propos de nous montrer ton code? Le MSB est un peu, votre exemple montre deux bits (11, 00, 01,etc). Vous devez "et" la partie supérieure de deux bits, puis en décalage à droite 6 bits.
(x >> 6) & 3
vous donnera le 2 Esm.
Vous devez vous connecter pour publier un commentaire.
Il semble que ce que vous voulez obtenir la valeur des deux premiers bits les plus significatifs.
Cela peut être fait par le filtrage et la valeur de 6 bits vers la gauche:
&
avant la maj?Vous n'avez pas besoin de le stocker en tant que chaîne de caractères, il suffit d'utiliser les opérateurs sur les bits:
La
0xff
"sélectionne" (masques), seuls les 8 premiers bits, de sorte que si lechar
type est en fait plus grande que 8 bits, puis tout le reste est ignoré.Par le passage de 6 bits vers la droite, vous arrivez à garder seulement les deux plus importantes. Ensuite, vous pouvez appliquer un
switch
comme:myByte & 0xC0
à la place?0xff
à la réponse.00000011
et0xC0
est11000000
, ça fait une grosse différence lors du masquage de bits, surtout si vous vous apprêtez à les déplacer par la suite.&
opérateur masques de bits. Si un bit du masque est à 1, le bit correspondant dans le masqués valeur est conservée, sinon il est mis à 0.unsigned char
commechar
peut être signé et le déplacement sur les entiers signés est en fait de la mise en œuvre définies et ne peuvent pas être portable.0xff
est11111111
. Il suffit de penser,0xc0
ne peut pas être plus grand que0xff
.00000011
est3
, BTW.0xFF
est un seul octet. Dans ce cas, depuischar
est de 1 octet, de le masquer par0xFF
est redondant et inutile, juste maj comme ça, ou en option masque avec0xC0
.0xc0
ou0xff
est exactement le même, parce que tu perds les 6 premiers bits de toute façon. Je préfère cette dernière parce que c'est plus clair dans mon esprit. Comme de multi-octets valeurs, je ne comprends pas comment ils pourraient changer quoi que ce soit,0xff
a la même valeur, peu importe la taille du type.0xFF
, il obtient masqué comme0x00FF
, pas comme0xFFFF
. Si vous avez un masque de 32 bits de type avec0xFF
, il obtient masqué comme0x00000000FF
, pas comme0xFFFFFFFF
. Essayez-le et vous verrez.0x00ff
, c'est le but de comportement, de "sélectionner" les 8 premiers bits. Quel est le lien avec le commentaire que vous avez fait ci-dessus "0xFF
est00000011
et0xC0
est11000000
", qui est tout simplement faux, peu importe si multi-octets ou pas?D'abord, endianness a à voir avec l'ordre des octets dans un mot, pas avec l'ordre des bits dans un octet.
Deuxièmement, vous avez besoin de deux bits les plus significatifs, pas la MSB.
Cela dit, voici le code:
Donc, si l'Esm sont 11, la valeur de x sera de 3. Si c'est 10, puis 2. Si 01, puis 1. Si le 00, puis 0.
Unsigned
-ness de la variable est importante; elle rend l' >> opérateur de se comporter comme une opération de bits de décalage, pas comme décalage. Avec unsigned char
variable, vous voulez l'expression suivante à la place:Signé-ness de la vanille
char
type de données par le compilateur, et plate-forme spécifique, et peuvent être affectées par les options du compilateur.