129 votes

Comment obtenir des données bit par bit à partir d'une valeur entière en C ?

Je veux extraire les bits d'un nombre décimal.

Par exemple, 7 est binaire 0111, et je veux obtenir 0 1 1 1 tous les bits stockés dans bool. Comment puis-je le faire ?

OK, une boucle n'est pas une bonne option, puis-je faire autre chose pour cela ?

197voto

forefinger Points 1589

Si vous voulez le k-ième bit de n, alors faites

(n & ( 1 << k )) >> k

Ici, nous créons un masque, nous appliquons le masque à n, puis nous décalons à droite la valeur masquée pour obtenir le bit que nous voulons. Nous pourrions l'écrire de manière plus complète comme suit :

    int mask =  1 << k;
    int masked_n = n & mask;
    int thebit = masked_n >> k;

Vous pouvez en savoir plus sur le masquage des bits aquí .

Voici un programme :

#include <stdio.h>
#include <stdlib.h>

int *get_bits(int n, int bitswanted){
  int *bits = malloc(sizeof(int) * bitswanted);

  int k;
  for(k=0; k<bitswanted; k++){
    int mask =  1 << k;
    int masked_n = n & mask;
    int thebit = masked_n >> k;
    bits[k] = thebit;
  }

  return bits;
}

int main(){
  int n=7;

  int  bitswanted = 5;

  int *bits = get_bits(n, bitswanted);

  printf("%d = ", n);

  int i;
  for(i=bitswanted-1; i>=0;i--){
    printf("%d ", bits[i]);
  }

  printf("\n");
}

82 votes

(n >> k) & 1 est tout aussi valable et ne nécessite pas de calculer le masque puisque le masque est constant en raison du décalage avant le masquage et non l'inverse.

0 votes

@Joe pouvez-vous expliquer cela, peut-être dans une réponse, s'il vous plaît ?

1 votes

@Yar a étendu un peu mon commentaire et ajouté une nouvelle réponse comme demandé

14voto

wallyk Points 33150

Voici une façon de le faire - il y en a beaucoup d'autres :

bool b[4];
int v = 7;  // number to dissect

for (int j = 0;  j < 4;  ++j)
   b [j] =  0 != (v & (1 << j));

Il est difficile de comprendre pourquoi l'utilisation d'une boucle n'est pas souhaitée, mais il est assez facile de dérouler la boucle :

bool b[4];
int v = 7;  // number to dissect

b [0] =  0 != (v & (1 << 0));
b [1] =  0 != (v & (1 << 1));
b [2] =  0 != (v & (1 << 2));
b [3] =  0 != (v & (1 << 3));

Ou l'évaluation d'expressions constantes dans les quatre dernières déclarations :

b [0] =  0 != (v & 1);
b [1] =  0 != (v & 2);
b [2] =  0 != (v & 4);
b [3] =  0 != (v & 8);

3voto

prateek Points 579

Voici un moyen très simple de le faire ;

int main()
{
    int s=7,l=1;
    vector <bool> v;
    v.clear();
    while (l <= 4)
    {
        v.push_back(s%2);
        s /= 2;
        l++;
    }
    for (l=(v.size()-1); l >= 0; l--)
    {
        cout<<v[l]<<" ";
    }
    return 0;
}

0voto

wildplasser Points 17900

Si vous ne voulez pas de boucles, vous devrez l'écrire :

#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    int num = 7;

    #if 0
        bool arr[4] = { (num&1) ?true: false, (num&2) ?true: false, (num&4) ?true: false, (num&8) ?true: false };
    #else
        #define BTB(v,i) ((v) & (1u << (i))) ? true : false
        bool arr[4] = { BTB(num,0), BTB(num,1), BTB(num,2), BTB(num,3)};
        #undef BTB
    #endif

    printf("%d %d %d %d\n", arr[3], arr[2], arr[1], arr[0]);

    return 0;
}

Comme démontré ici, cela fonctionne également dans un initialisateur.

0voto

anon Points 1
#include <stdio.h>

int main(void)
{
    int number = 7; /* signed */
    int vbool[8 * sizeof(int)];
    int i;
        for (i = 0; i < 8 * sizeof(int); i++)
        {
            vbool[i] = number<<i < 0;   
            printf("%d", vbool[i]);
        }
    return 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X