2013-03-10 7 views
5

stavo usando std::bitset<N> nel mio programma e avevo bisogno di trovare il bit meno significativo insieme e ha fatto il calcolo banale come di seguito:C'è un modo banale per ottenere complemento a 2 di uno std :: bitset <N>

int num = 5; 
int res = num & (-num); 

Dopo di che il bit meno significativo di num è impostato su res e il resto su tutti è 0. Funziona come -5 è rappresentato nella notazione complemento a 2.

Ma ho trovato std::bitset<N> non ha alcun overload di operatore per unario operator - che mi avrebbe dato il complemento 2 per i bit sottostanti. C'è un modo banale per implementare il complemento 2 con std::bitset<N>? Potrei sempre usare per capovolgere i bit e ricollegarli facendo la somma e portandoli a partire da LSB a MSB, ma stavo cercando una soluzione che evitasse questo.

+2

Certamente ci sono molti ** modi non banali di fare quasi tutto! – rodrigo

+0

Ho notato che avrei dovuto usare __trivial__ :-p Modifica il titolo. – vvnraman

+2

Si noti che il looping sul bitset capovolto è molto probabilmente più veloce del semplice loop sul bitset originale per trovare il bit meno significativo (che trovo la soluzione banale in questo caso;)) – Zeta

risposta

2

std::bitset non fornisce alcun metodo del complemento. Dal momento che si dovrà calcolare il complemento te stesso con operator~ e un ciclo ulteriore, semplicemente ignorare operator~() e cercare il LSB direttamente:

template <int N> 
size_t least_significant_bit(const std::bitset<N> &bt){ 
    for(size_t i = 0; i < bt.size(); ++i){ 
     if(bt.test(i)) 
      return i; 
    } 
} 

credo che non può ottenere più banale di quello;).

Si noti che il risultato di least_significant_bit non è specificato se non c'è alcun bit. Si potrebbe restituire N o cambiare il ciclo per testare bt.test(N) che genererebbe un'eccezione, ma dopotutto non ha senso cercare un LSB in un bitset annullato.

Inoltre, è possibile utilizzare std::bitset<N>::operator[] anziché std::bitset<N>::test se non si è interessati ai controlli di confine.

+0

Scusa per il pasticcio indice, stavo pensando in termini di ['to_string()'] (http://en.cppreference.com/w/cpp/utility/bitset/to_string) (* "La stringa risultante contiene N i caratteri con il primo carattere corrispondono all'ultimo (N-1 °) bit e l'ultimo carattere corrispondente al primo bit. "*) invece di utilizzare la logica a bit semplice>. < – Zeta

0

un metodo molto conveniente per fare il complemento a due è trovare il meno significativo 0 nel bitset, l'impostazione che a 1 e impostando tutti i bit meno significativi a 0.

pseudocodice: (assumendo che insieme [0] è il bit meno significativo, se non, girare intorno)

int i = 0; 
while (i < set.length && set[i]) 
    { 
    set[i] = 0; 
    ++i; 
    } 

if (i < set.length) 
    set[i] = 1; 
+1

Non c'è nessun operatore 'o' operatore + ', quindi l'inconveniente :-) – vvnraman

+0

@vvnraman hai ragione. Ho aggiornato la mia risposta. –

+0

non dimenticare di gestire il caso tutti – assem

Problemi correlati