Ottenere il numero di bit impostato in un numero intero grande

2

Ho un numero intero intero N < 10 ^ 2500. Ho bisogno di ottenere il numero di bit impostati nella sua rappresentazione binaria. Il numero è indicato nella base 10 in un file. Ecco come lo sto facendo adesso:

Ho creato una classe chiamata BigNumber che utilizza un array per memorizzare interi molto grandi.

  1. Sto analizzando il numero in un oggetto BigNumber in base 10.
  2. Sto convertendo detto numero in base 2^x (usando 25 per x ora, ma ciò che importa è che è una potenza di 2). Per la conversione uso ripetutamente il metodo standard di divisione della base fino a quando il quoziente è 0.
  3. Poiché il numero di bit impostato in a * 2^x è uguale al numero di bit impostato in a (possiamo scrivere a come somma di n potenze di 2 e quando moltiplichiamo per una potenza di 2 otterremo n fattori quindi n bit) Ho solo bisogno di calcolare il numero di bit impostato in ogni cifra del mio numero usando Algoritmo SWAR per x < 32, e li riassumono.

Questo metodo funziona, ma è molto lento (richiede molto tempo per un numero di 2500 cifre), e presumo che sia dovuto alla mia implementazione dell'algoritmo di divisione o di cambio di base.

Qui è la mia intera classe BigNumber in C ++.

Mi sto avvicinando a questo nel modo giusto? E se sì, come posso farlo funzionare più velocemente?

This is for learning, not production code, so I'm not going to use already implemented libraries.

    
posta Adrian 20.09.2016 - 15:54
fonte

1 risposta

2

Hai piuttosto legato le tue mani memorizzando il tuo BigNumber in base 10, ma posso vedere la praticità di farlo, sia per l'input che per l'output e per il debug generale.

La divisione è sempre più lenta di quanto ti aspetteresti, quindi dovresti creare una nuova classe BigNumber33554432 che utilizzi la base 2 ^ 25 anziché la base 10. Devi solo averla in grado di aggiungere numeri tra 1 e 9 in un BigNumber e moltiplicare un BigNumber per 10, quindi sarà davvero facile da scrivere e veloce da eseguire. Quindi puoi convertire i numeri di base 10 in base 2 ^ 25 leggendo le cifre da sinistra a destra. Ad ogni passo, moltiplica il risultato corrente per 10 e aggiungi la nuova cifra.

Una volta ottenuto il numero base-2 ^ 25, il conteggio dei bit, come dici tu, sarà rapido e facile.

    
risposta data 20.09.2016 - 16:33
fonte

Leggi altre domande sui tag