Masque et d'en extraire les bits en C
J'ai regardé tous les posts sur le masque, mais ne peut toujours pas obtenir ma tête autour de la façon d'extraire certains bits à partir d'un certain nombre de C.
Dire si nous avons un int number 0001 1010 0100 1011
, il est donc représentation hexadécimale est x1a4b
droit? Si je veux savoir la 5ème à la 7ème numéro, qui est 101
dans ce cas, doit-je utiliser int mask= 0x0000 1110 0000 0000, int extract = mask&number
?
Aussi comment puis-je vérifier si il est 101
? Je suppose que ==
ne fonctionne pas ici... merci Beaucoup!
si vous voulez vérifier la
Je pense que votre premier nombre est
désolé de ma mauvaise! corrigés.
Qu'est-ce que ce
5th
et 7th
nombre est 101
ou pas, alors gardez le masque comme int mask= 0x0000 1010 0000 0000
. et puis ExNOR
.. si extract
5th
et 7th
bits est 111
, alors il est 101
Je pense que votre premier nombre est
0x1a4b
pas 0x1a43
?désolé de ma mauvaise! corrigés.
Qu'est-ce que ce
0x0000 1110 0000
? Dans le cas où vous voulez montrer un peu de la série ce qui est faux, comme 0x
indique une hexadécimal littérale.OriginalL'auteur stillAFanOfTheSimpsons | 2014-10-14
Vous devez vous connecter pour publier un commentaire.
En supposant que la gcc extension
0b
de définir binaire de littéraux:OriginalL'auteur alk
De masquage est fait en mettant tous les bits à l'exception de celle(s) que vous souhaitez 0. Donc, disons que vous avez un 8 bits variable et que vous voulez vérifier si la 5ème bits de l'est 1. Disons que votre variable est
00101100
. Pour masquer tous les autres bits nous avons mis tous les bits à l'exception de la 5e à 0, en utilisant le & opérateur:Maintenant ce que cela fait, c'est pour tous les bits sauf le 5e, le bit de l'octet sur le droit sera de 0, de sorte que le résultat de la & l'opération sera de 0. Pour la 5ème peu, cependant, la valeur à partir de la droite est 1, alors le résultat sera quelle que soit la valeur de la 5e bits à partir de la gauche de l'octet - dans ce cas, 0:
Maintenant de vérifier cette valeur, vous devez comparer avec quelque chose. Pour ce faire, il suffit de comparer le résultat avec l'octet de droite:
De généraliser cela, vous pouvez récupérer tous les bits de l'octet de gauche, simplement en déplaçant 00000001 jusqu'à ce que vous obtenez la peu que vous le souhaitez. La fonction suivante réalise ceci:
Cela fonctionne sur vars de n'importe quelle taille, qu'il est à 8, 16, 32 ou 64 (ou quoi que ce soit d'autre d'ailleurs).
OriginalL'auteur PandaConda
Vous avez besoin de masquer et maj. Soit changer la valeur de la comparaison, ou la valeur de la comparaison. Je trouve plus facile de penser en changeant la valeur de la comparaison. Ainsi, si vous essayez d'extraire du 5 au 7 chiffres (à partir de la gauche), vous déplacer droit 9 positions (16-7), de sorte que le 7ème chiffre est aujourd'hui le plus à droite, puis appliquer 0x7 (111 en binaire) comme un masque pour obtenir seulement le plus à droite de trois chiffres binaires
Non, je n'ai pas, il est à compter à partir de la gauche, pas la droite!
Comment n'est-ce pas répondre à la question?
OriginalL'auteur sirlark
Tout d'abord, les chiffres binaires sont (généralement) compté à partir de la droite (le 10 et le 12 chiffres) ou vous dire la 5e et la 7e plus de chiffres significatifs.
résultats dans:
Vous pouvez faire
pour tester, ou:
Les deux états dans le si retournera true avec votre numéro de l'échantillon.
Généralement avec un masque, vous trouverez vous-même un test sur un seul chiffre. Vous pouvez utiliser une fonction comme ceci pour le tester:
Merci! mais avec
if (( extract >> 9 ) == 0x101)
, estx101
fait0001 0000 0001
? Devrait-il êtreif (( extract >> 9 ) == 0b101)
?Oui, je l'ai fait un peu mal. Fixe maintenant. (à l'aide de pure hex)
OriginalL'auteur Baldrickk
doit-je utiliser int mask= 0x0000 1110 0000 0000, int extrait = masque&nombre?-
Oui, vous pouvez le faire.
Aussi comment puis-je vérifier si il est de 101?
Bien sûr, vous pouvez vérifier ce-
0000 1010 0000 0000 qui est de 1280 en int .
extrait== 1280
OriginalL'auteur hitesh
Il peut être plus simple pour vérifier les bits un par un, pas tous à la fois.
Au premier abord, vous créez un masque pour les intéressés bits:
Maintenant, vous pouvez comparer les résultats avec zéro OU avec un masque.
En comparant avec zéro peut être omis, de sorte que vous pouvez simplement utiliser simple si:
Aussi, vous pouvez comparer avec les masques. Après l'opération &, dans la suite fixera seulement bits, ce qui a été défini dans le masque.
Donc, il pourrait comme ceci:
si (fifthBitResult == fifthBitMask && seventhBitResult == seventhBitMask)
{
//votre code ici
}
Donc, si le résultat de l'opération est égal à un masque, vous pouvez le faire avec une seule opération:
OriginalL'auteur noktigula
Tout d'abord, votre calcul pour bits 7-6-5 est incorrct. Vous avez déclaré qu'il était de 101 mais il est 010 (pour x1a43)
Deuxième de tous, pour obtenir ces bits (la valeur représentée par ces bits) que vous devriez faire
&0xE0
.int my_bits_from_5to7 = number & 0xE0;
nope, les bits de commande sur la plupart des architectures est toujours le même: de la droite vers la gauche, et le premier bit de poids faible est toujours le numéro 0.
Vrai, mais si l'OP n'est pas familier avec les opérations bit à bit, il est probable qu'ils seraient aussi ignorer les conventions telles que: compter à partir de zéro et de droite à gauche (alors que l'anglais est lue de gauche à droite).
OriginalL'auteur Ruslan Gerasimov