Sulla base: http://www.hackersdelight.org/HDcode/nlz.c.txt
template<typename T> int clz(T v) {int n=sizeof(T)*8;int c=n;while (n){n>>=1;if (v>>n) c-=n,v>>=n;}return c-v;}
Se vuoi una versione che ti permette di tenere il pranzo giù, ecco qui:
int clz(uint64_t v) {
int n=64,c=64;
while (n) {
n>>=1;
if (v>>n) c-=n,v>>=n;
}
return c-v;
}
Come vedrai, puoi salvare i cicli su questo facendo un'attenta analisi dell'assemblatore, ma la strategia qui non è terribile. Il ciclo while opererà Lg [64] = 6 volte; ogni volta convertirà il problema in uno di contare il numero di bit iniziali su un numero intero di metà della dimensione. L'istruzione if all'interno del ciclo while pone la domanda: "posso rappresentare questo numero intero a metà di molti bit" o, analogamente, "se lo taglio a metà, l'ho perso?". Una volta completato il payload if(), il nostro numero sarà sempre nel numero più basso di bit. Nella fase finale, v è 0 o 1 e questo completa correttamente il calcolo.
fonte
2010-11-04 15:48:59
Sei interessato a C, C# o C++? La teoria è la stessa, ma le lingue sono diverse. –
Dal momento che ho assunto un po 'di magia per fare questo e sembra praticamente lo stesso in tutte le lingue, non importa. – thr
Google "fxtbook.pdf", capitolo 1.6.1 –