2016-07-11 3 views
2

J'ai un tableau de neuf éléments et un nombre entier. En utilisant l'entier et le masquage de bit, je veux enregistrer des informations sur la validité d'un élément du tableau. Donc, ma question est: Y at-il un moyen plus simple que d'utiliser log2() de math.h pour obtenir de mon masque de bit à mon numéro d'élément de tableau? Par exemple, je stocke foo2,foo4 et foo5 en mValue en utilisant le masquage de bit. Ensuite, je veux obtenir l'élément de tableau à la position foo2 = 2, qui est le deuxième bit, de sorte que le 2e élément de tableau, qui est 34. Mais la seule façon dont je peux penser est la fonction log2(n). Y a-t-il un plus simple utilisant le transfert de bits peut-être?Façon simple d'obtenir le nième élément de tableau quand tout ce que j'ai est n^2

Tout simplement, je veux faire:

Est-ce le n-ième bit d'un nombre entier mValue mis à 1? alors obtenez-moi le nième élément d'un tableau bar.

#include <math.h> 

const int foo1 = 1; 
const int foo2 = 2; 
const int foo3 = 4; 
const int foo4 = 8; 
const int foo5 = 16; 

int bar[9] = {23,34,82,8,7,0,23,19,20}; 
int mValue; 

void SetValue(int nVal) 
{ 
mValue = nVal; 
} 

bool IsElementValid(int nVal) 
{ 
return mValue & nVal; 
} 

int main() 
{ 
SetValue(foo2 | foo4 | foo5); 
IsElementValid(foo4); //true 
IsElementValid(foo5); //true 
IsElementValid(foo1); //false 

//access array element 1 with value foo2 (2) 
if(IsElementValid(foo2)) 
    printf("%d\n",  bar[log2(foo2)]); // output: '34' 
} 
+0

[cette question et réponses] (http://stackoverflow.com/questions/757059/position-of-least-significant-bit-that-is-set) pourraient vous être utiles – mvidelgauz

Répondre

2

L'idiome habituel est:

if (mValue & (1<<n)) { 
    return bar[n]; 
} 

EDIT: Mais si la seule chose que vous avez vraiment est 2^n (et vous ne pouvez pas tourner votre logique autour), vous pouvez encore éviter le coûteux (et double/flotteur) appel à log2:

int bit_pos=0; 
unsigned int value = ...; // your input 

while (value>1) { 
    value >>= 1; 
    bit_pos++; 
} 

bit_pos contient maintenant la position du bit de jeu le plus élevé dans value; si value=2^n, ce sera n. Je suppose qu'il y a des manières plus élégantes et/ou plus rapides (je ne mettrais pas Intel ou d'autres compagnies pour créer une commande de niveau assembleur pour ceci), mais j'optimiserais ces choses seulement si nécessaire.

+0

Merci! mais cela ne marcherait que si j'avais 'n'. Mais ce que j'ai est '2^n'. – tzippy

+0

Quand vous n'avez que nVal '2^n' (mais pourquoi?) Cela n'a aucun sens, d'habitude il est assez facile de garder" n "à la place, ou vous balayez la plupart des bits dans une boucle, là encore garder l'index est facile): vous pouvez vérifier si votre compilateur a une fonction de comptage de bits, par exemple gcc a 'int __builtin_popcount (non signé int x)', alors alors 'n = __builtin_popcount (nVal-1);' @tzippy – Ped7g

1
if (mValue & (1<<n)) { 
    printf("%d\n", bar[n]); 
} 

Je suis un peu novice dans le domaine du twittling mais cela pourrait fonctionner?