2009-01-23 13 views

Répondre

1

Quelle langue?

Je voudrais boucler 64 fois et ensuite décaler votre nombre pour inspecter les bits, puis stocker le bit précédent et le comparer à celui en cours. Si c'est différent, inscrivez votre compte.

+0

force brute, mais fonctionnera très bien – nlaq

0

Ok, avec des transitions que vous voulez dire que si vous marchez à travers la chaîne de 0-s et 1 s, on compte chaque occurence que 0 suit un 1 ou un 0. 1 suit un

C'est facile par décaler les bits et compter les changements:

transitions(n) 
    result = 0 
    prev = n mod 2 
    n = n div 2 
    while n<>0 
    if n mod 2 <> prev then 
     result++ 
     prev = n mod 2 
    fi 
    n = n div 2 
    elihw 
    return result 

vous pouvez remplacer le mod et div avec des changements.

2

Le plus rapide dépend de votre scénario: Comme vous avez spécifié votre type de données en tant que taille constante (entier non signé), cela est possible avec une table de recherche. Mais quand vous avez besoin de cette opération seulement une fois que la surcharge constante pour init la table est trop grande, et le balayage + comptage à travers l'int est beaucoup plus rapide malgré.

Je suppose que le meilleur serait une combinaison: Rechercher une table pour un octet ou un mot (256 ou 64k entrées n'est pas beaucoup), puis combiner les octets/mots par leur dernier/premier bit.

+1

une table de recherche de 256 octets est assez raisonnable, mais un 64 Ko est sûr de souffler le cache L1. – Crashworks

2

en C/C++ je ferais ce qui suit:

unsigned int Transitions(unsigned int value) 
{ 
    unsigned int result = 0; 

    for (unsigned int markers = value^(value >> 1); markers; markers = markers >> 1) 
    { 
     if (markers & 0x01) result++; 
    } 

    return result; 
} 
+0

Je pense qu'il ya une erreur dans votre implémentation: Si je le donne: 0x8000000b = 0b10000000000000000000000000001011 qui possède 4 états votre fonction compte 5! – tormod

+0

C'est simplement parce que l'itération n'est pas limitée à 32 bits (pour réduire le nombre d'opérations), vous pouvez ajouter un contrôle supplémentaire, mais cela ajouterait des opérations qui le ralentiraient un peu. Cette implémentation est essentiellement une version compacte de la solution Crashworks. – Dan

1

Voici le code à l'aide décalage arithmétique + XOR et la méthode de Kernighan pour le comptage de bits :

int count_transitions(int x) 
{ 
    assert((-1 >> 1) < 0); // check for arithmetic shift 
    int count = 0; 
    for(x ^= (x >> 1); x; x &= x - 1) 
     ++count; 
    return count; 
}