Comment extraire des bits spécifiques d'un nombre en C?
J'ai besoin d'extraire une partie spécifique (pas de bits) d'un short
type de données en C.
Par Exemple j'ai un fichier binaire de 52504 comme 11001101000 11000 et je veux d'Abord 6 ( à PARTIR de LSB --> MSB-je.e 011000 décimal 24) bits et de repos de 10 bits ( 11001101000 décimal 820).
De même je veux que cette fonction soit trop généralisé pour extraire spécifique pas de bits de donnée "début" et "fin" (j'.e morceaux de bits équivalent avec une certaine valeur décimale).
J'ai vérifié d'autres posts, mais ceux qui n'étaient pas utiles, car les fonctions ne sont pas trop généralisée.
J'ai besoin de quelque chose qui peut travailler pour short
type de données de C.
Modifier
Je vais avoir le bref tableau de la taille de 2048 octets. Où chaque Pixel est de 10 bits. Donc, mon 16 bits composé chaque octet occupant peu de temps de 2 pixels de données, parfois 3 pixels de données.
Comme
( PIXEL : 0,1 )
10 BITS + 6 BITS
ensuite ( en PIXELS : 1,2,3 )
4 BITS ( 1er pixels bits restants ) + 10 BITS + 2 BITS.
et ainsi de suite ..ce modèle continue ...
Donc, tout ce que je veux extraire chaque pixel et de faire un tableau d'ensemble de chaque pixels à être occupé entièrement en ENTIER d'OCTETS ( 16 bits)..
1 octet doit contenir 1 les DONNÉES de PIXEL, l'autre OCTET devrait contenir d'autres valeur de PIXEL en entier de 16 bits et ainsi de suite ainsi de suite.
source d'informationauteur Usman | 2012-04-10
Vous devez vous connecter pour publier un commentaire.
Il y a deux blocs de construction que vous avez besoin de savoir pour construire vous-même:
N
least significant bits nécessite de construire un masque de bits avecN
à la fin. Vous faites comme ceci:((1 << N)-1)
.1 << N
est2 ^ N
: il a un seul1
à laN+1
st position, et tous les zéros après. En soustrayant une vous donne le masque que vous avez besoin.M
least significant bits est un simple décalage vers la droite:k >> M
Maintenant votre algorithme pour la coupe de
M
àN
devient un processus en deux étapes: vous changez la valeur d'origineM
bits vers la droite, puis effectuer un bit par bitAND
avec le masque deN-M
.Ce fragment de coupe bits à partir de 4, inclusive, à 16, exclusif, et imprime
bee
lorsque vous l'exécutez. Les Bits sont numérotés à partir de zéro.Noter que
[begin, end)
est un demi-intervalle ouvert.Il peut être fait comme ceci:
où
n
est l'original entier etvalue
est l'extrait bits.La
mask
est construit comme ceci:Maintenant
n
est décalé à droite parstart
bits pour aligner le désiré bits vers la gauche.Puis un bit à bit ET donne le résultat.
vous pouvez ajouter des paramètres pour obtenir les valeurs ou quelque chose
Bien que c'est une très vieille question, je voudrais ajouter une autre solution. À l'aide de macros,
/*
Ici,
startBit : bit de start position(compter à partir de la LSB)
endBit : bit de fin de position(compter à partir de la LSB) .REMARQUE: endBit>startBit
nombre : le nombre à partir duquel extraire les bits
maxLength:la somme de la taille en bits d'un nombre.
*/
`
`
De sortie :
Entrées : 1 5 255 32
Le numéro d'entrée : 255
Sortie : 62
Ici, 255 = 11111111 et 62 = 00111110