10
votes

Vérifiez si un bit n'est défini qu'une seule fois dans une série de bitsets

J'essaie de trouver la façon dont quelle est la bonne approche pour y parvenir: Imaginez que nous avons un groupe de bits comme suit:

00010


2 commentaires

Je suis très curieux de la réponse la plus courte possible à cela. Je peux penser à plusieurs façons de y parvenir, mais j'essaie de formuler une opération à une doublure.


Si vous connaissez la série à l'avance: Transposez-la et recherchez une puissance de 2: cela indiquera que la (s) colonne (s) n'a qu'un seul bit.


3 Réponses :


10
votes

Comme vous pouvez le voir, vous ne pouvez pas le faire à l'aide d'un seul ensemble pour stocker des résultats intermédiaires, car vous devez distinguer entre 3 états pour chaque bit: Ne jamais définir, définir une fois et définir plus d'une fois.

Donc, vous avez besoin au moins 2 résultats intermédiaires. Par exemple, vous pouvez suivre des bits définis au moins une fois et les bits définis plus d'une fois séparément: xxx

ou en utilisant bitset s (il ne semble pas le cas Élégant, car bitset n'est pas immutable): xxx


2 commentaires

J'essayais la même chose avec exacormeOnce , plutôt que ATLESONCE , mais votre solution est définitivement plus propre


Remplacer int par bitset ou supposez simplement un modèle abstrait où int s est arbitrairement long.



4
votes

Vous pouvez utiliser l'approche une fois deux fois:

  • pour chaque collection
    • pour chaque élément
      • Si l'élément est dans le une fois que définit
        • ajoutez-le au deux fois SET
        • sinon
          • ajoutez-le au une fois SET
          • retour une fois - deux fois

            Le truc ici est qu'il peut être effectué en parallèle:

            • pour chaque collection C
              • deux fois : = deux fois ou ( une fois et c )
              • une fois : = une fois ou c

                La mise en œuvre pourrait ressembler à: xxx


0 commentaires

1
votes
int length = 5;
int count[] = new int[length];
for (i = 0; i < bitset.length(); i++) {   
    int value = bitset[i];
    unsigned int count = 0;

    for (int j = 0; j < length; j++) {           // until all bits are zero
        if ((value & 1) == 1)     // check lower bit
            count[j]++;
        value >>= 1;              // shift bits, removing lower bit
    }
}

int number = 00000;
for (int k = 0; k < 5; k++) {
    if (count[k] == 1) 
         number = number | 1; 
    number >>= 1;
}

number is desired answer

0 commentaires