Comment puis-je extraire les bits de 32 bits en nombre
Je n'ai pas beaucoup de connaissances en C et im coincé avec un problème comme l'un de mes collègue est en congé.
J'ai un nombre 32 bits et j'ai pour extraire les bits à partir d'elle. Je l'ai fait passer par un petit nombre de threads, mais im toujours pas clair comment le faire. Je vous serais très obligé si quelqu'un peut m'aider.
Voici un exemple de ce que je dois faire:
Supposer nombre hexadécimal= 0xD7448EAB.
En binaire= 1101 0111 0100 0100 1000 1110 1010 1011
J'ai besoin d'extraire de 16 bits, et la sortie de cette valeur. Je veux bits 10 à 25.
La baisse de 10 bits (Décimal) sont ignorés. c'est à dire,10 1010 1011 sont ignorés.
Et la partie supérieure de 6 bits (Dépassement de capacité) sont ignorés. c'est à dire, 1101 01 sont ignorés.
Les 16 bits de données à la sortie, ce qui est 11 0100 0100 1000(chiffres en italique sont nécessaires à la sortie).
C'était un exemple, mais je continue à recevoir de différents nombres hexadécimaux tout le temps et j'ai besoin d'extraire les mêmes bits comme je l'ai expliqué.
Comment puis-je résoudre ce problème?
Merci.
Pour cet exemple, vous devriez sortie 1101 0001 0010 0011, qui est 0xD123, ou 53,539 décimal.
- Avez-vous besoin de tout garder en forme binaire? Ou voulez-vous être en mesure de convertir la valeur hexadécimal en binaire, puis de convertir la valeur binaire en une chaîne de caractères. Vous pouvez ensuite il suffit de prendre la sous-chaîne qui vous intéresse, et de la convertir en binaire/hexadécimal en tant que de besoin.
- Et (& operator) votre valeur avec un masque avec les bits set qui vous intéresse, puis le déplacement à droite le résultat (>> opérateur) pour les aligner avec les bits à zéro.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin masques pour obtenir les bits que vous souhaitez. Masques sont les numéros que vous pouvez utiliser pour passer au crible les bits de la manière que vous voulez (garder bits, supprimer/effacer les bits de modifier les numéros etc). Ce que vous devez savoir sont les ET, OU, XOR, NOT, et le déplacement opérations. Pour ce que vous avez besoin, vous aurez seulement besoin d'un couple.
Vous savez déplacement:
x << y
se déplace bits de x *y des positions à gauche*.Comment obtenir de x bits mis à 1 dans l'ordre:
(1 << x) - 1
Comment obtenir de x bits mis à 1, dans l'ordre, en commençant à partir de y à y + x:
((1 << x) -1) << y
Ci-dessus est votre masque pour les éléments dont vous avez besoin. Ainsi, par exemple, si vous voulez 16 bits de 0xD7448EAB, de 10 à 25, vous aurez besoin de ce qui précède, pour x = 16 et y = 10.
Et maintenant pour obtenir les bits que vous voulez, il suffit de ET votre numéro de 0xD7448EAB avec le masque ci-dessus et vous obtiendrez la masqué 0xD7448EAB avec seulement les bits que vous souhaitez. Plus tard, si vous voulez aller à travers chacun d'eux, vous aurez besoin de changer votre résultat par 10 pour le droit et le processus de chaque bit à la fois (à la position 0).
La réponse peut être un peu plus long, mais c'est mieux de la conception que de simplement le codage en dur avec 0xff ou quoi que ce soit.
OK, voici comment je l'ai écrit:
La
in >> 10
décale le nombre à droite 10 bits; le& 0xffff
ignore tous les bits sauf les 16 bits de poids faible.=
et&=
séparément, au lieu d'utiliser=
et&
dans la même déclaration?&
a précédent questions (qui peut vraiment se débarrasser de quelqu'un qui ne connaît pas les cordes de C)extract(unsigned num, unsigned hi, unsigned lo)
qui retourne les bits de gammehi
àlo
denum
?Vous pouvez faire ceci:
Ou ceci:
>> 10
est correct pour ce que vous avez demandé. À l'aide de>> 8
serait de vous donner les bits 8 à 23 au lieu de cela, ce qui n'est pas ce que vous avez demandé.J'ai combiné les 2 réponses ci-dessus pour écrire un programme C qui extrait les bits de toute une série de bits (et pas seulement de 10 à 25) de 32 bits unsigned int. La façon dont la fonction est qu'elle retourne les bits
lo
àhi
(inclusivement) denum
.