2017-08-30 5 views
2

Je dois trouver la valeur du masque par rapport au nombre fourni par l'utilisateur.Basculer le bit haut à 1 et mettre les bits à 0 [exemple: 10110 à 10000]

Par exemple. Si l'utilisateur fournit l'entrée comme

22 (en binaire 10110)

puis je dois trouver la valeur de masque en changeant le bit de l'entrée comme 1 et de repos à 0. Donc, dans ce cas, il devrait être:

16 (en binaire 10000)

est-il une méthode dans c langue intégrée pour le faire.

+0

Êtes-vous à la recherche de binaire et? ('22 & 16 == 16') – cubrr

+0

Donc, vous voulez garder le bit le plus élevé qui vaut 1 et mettre tous les autres à zéro? Exemples: 1010 -> 1000, 10100111 -> 100000000, 111 -> 100 etc. Il n'y a pas de fonction intégrée, mais vous pouvez facilement en écrire une (estimation 4-5 lignes). –

+0

@cubrr Si j'ai déjà la valeur 16 alors quelle est l'utilisation de faire ET ici. par exemple si l'entrée est 86 alors son 2ème opérande je dois calculer et c'est mon but. – user5708039

Répondre

1

vous pouvez calculer la position du bit le plus élevé

Une fois que vous l'avez, quart de travail juste à gauche pour obtenir la valeur appropriée du masque:

unsigned int x = 22; 
    int result = 0; 

    if (x != 0) 
    { 
    unsigned int y = x; 
    int bit_pos=-1; 
    while (y != 0) 
    { 
     y >>= 1; 
     bit_pos++; 
    } 
    result = 1<<bit_pos; 
    } 

cette règle result-16

(il y a un cas particulier si la valeur saisie est 0)

+0

Merci pour votre réponse. fonctionne parfaitement. – user5708039

0

Fondamentalement, vous devez aligner le sol sur la puissance la plus proche de deux nombre. Je ne suis pas sûr qu'il existe une fonction standard pour cela, mais essayez ce qui suit:

static inline uint32_t 
floor_align32pow2(uint32_t x) 
{ 
     x |= x >> 1; 
     x |= x >> 2; 
     x |= x >> 4; 
     x |= x >> 8; 
     x |= x >> 16; 

     return (x >> 1) + (x & 1); 
} 
+1

Cela ne fonctionne pas si le bit supérieur de l'entrée est défini, par ex. 'floor_align32pow2 (0x80000000)' retournera 0 au lieu de 0x80000000. Vous pouvez le réparer avec 'return (x >> 1) + (x & 1);'. –

+0

@IanAbbott vous avez raison, merci –