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 ?
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 ?
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");
}
(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.
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);
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.
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.