9
votes

Trouver des positions de bits dans un entier non signé 32 bits

Je pense que j'ai peut-être endormi dans ma classe CS quand ils ont parlé de positions de bits, alors j'espère que quelqu'un peut prêter une main.

J'ai un entier 32 bits non signé (utilise la valeur: 28)

Selon une documentation que je passe, la valeur de l'entier contient des drapeaux spécifiant diverses choses.

Les positions de bits dans le drapeau sont numérotées à partir de 1 (bon ordre) à 32 (haut-ordre). Tous les bits d'indicateur indéfinis sont réservés et doivent être réglés sur 0.

J'ai une table qui montre la signification des drapeaux, avec signification pour les chiffres 1-10.

J'espère que quelqu'un peut tenter de m'expliquer et de me expliquer ce que tout cela signifie et comment trouver la valeur "drapeau" à partir d'un numéro comme, 28, basé sur la position du bit.

merci


0 commentaires

7 Réponses :


0
votes

supposer drapeaux est non signé ... xxx

si drapeaux est signé, vous devez remplacer xxx

avec xxx


0 commentaires

12
votes

28 convertit à 11100 en binaire. Cela signifie que les bits 1 et 2 ne sont pas définis et que les bits 3, 4 et 5 sont définis.

Quelques points: Tout d'abord, quiconque est vraiment habitué à c va généralement commencer la numérotation à 0, pas 1. Deuxièmement, vous pouvez tester des drapeaux individuels avec le bit et opérateur ( & ), comme dans: xxx

et ainsi de suite. Vous pouvez également vérifier quels bits sont définis dans une boucle: xxx

doit imprimer: xxx


2 commentaires

Jerry, votre première partie sur la valeur binaire est logique, mais je suis un peu confus sur le code que vous avez posté ... vous avez quels sont les articles Flag1, Flag2, etc. font référence aussi? Quand j'ai mis ce que vous avez, je reçois la sortie que 4 et 8 sont définis. Je ne sais pas ce que cela fait référence depuis ci-dessus, nous avons dit que les bits 3, 4 et 5 ont été définis


@kdbdallas: J'ai ajouté des commentaires au code que j'espère rendre le sens des drapeaux un peu plus apparents.



4
votes

pour obtenir un int code> avec la valeur 0 code> ou 1 code> représentant juste le n code> ort bit de cet entiteur , Utilisez:

int bitN = value & (1 << n);


0 commentaires

10
votes

Au lieu de boucler à travers chaque bit, vous pouvez plutôt boucler uniquement les bits définis, ce qui peut être plus rapide si vous vous attendez à ce que les bits soient essentiellement définis:

supposons que le champ de bit est dans le champ variable (entier scalaire). P>

while (field){
  temp = field & -field;  //extract least significant bit on a 2s complement machine
  field ^= temp;  // toggle the bit off
  //now you could have a switch statement or bunch of conditionals to test temp
  //or get the index of the bit and index into a jump table, etc.
}


0 commentaires

0
votes

Utilisez une fonction de journalisation, avec la base 2. Dans Python, cela ressemblerait à:

import math 

position = math.log(value, 2)


0 commentaires

0
votes

Une légère variation de la réponse de @ InvalidData-

unsigned int tmp_bitmap = x;        
while (tmp_bitmap > 0) {
    int next_psn = __builtin_ffs(tmp_bitmap) - 1;
    tmp_bitmap &= (tmp_bitmap-1);
    printf("Flag: %d set\n", next_psn);
}


0 commentaires

0
votes
// You can check the bit set positions of 32 bit integer.
// That's why the check is added "i != 0 && i <= val" to iterate till 
// the end bit position.
    void find_bit_pos(unsigned int val) {
            unsigned int i;
            int bit_pos;
            printf("%u::\n", val);
            for(i = 1, bit_pos = 1; i != 0 && i <= val; i <<= 1, bit_pos++) { 
                    if(val & i)
                            printf("set bit pos: %d\n", bit_pos);
            }
    }

0 commentaires