(stanco) se questo fosse il problema, l'errore "'k' - redefinition; different type modifiers" apparirebbe, ma non è nello screenshot. Quindi al compilatore non interessa e non è questo il problema.
Beh, provate a compilarlo voi stessi. Se non sei troppo pigro per scrivere post su questo argomento sul forum, dovresti essere troppo pigro per metterlo in un editor e premere F7. È molto più veloce.
Modo veloce per calcolare il logaritmo binario di un intero. Funziona 3-5 volte più veloce di MathLog.
int log2(ulong n)
{
if (n==0) return -1;
#define S(k) if (n >= (ulong(1)<<k)) { i += k; n >>= k; }
int i=0; S(32); S(16); S(8); S(4); S(2); S(1); return i;
#undef S
}
Entrambe le funzioni danno la stessa risposta corretta, non ho trovato errori.
È interessante confrontare la velocità di funzionamento. La mia versione ha un po' meno operazioni di spostamento e di addizione, ma c'è la moltiplicazione alla fine. La versione di Alexey ha un po' più operazioni di spostamento e di addizione, ma nessuna moltiplicazione. In che modo è più veloce?
La mia versione ha un po' meno operazioni di spostamento e di addizione, ma non di moltiplicazione; quella di Alexey ha un po' più operazioni di spostamento e di addizione, ma non di moltiplicazione. In che modo è più veloce?
Ho un massimo di 6 operazioni di shift e di addizione (ricerca binaria).Shift (ulong)1<<k non conta, perché è una costante. L'unica cosa è che controlliamo anche le condizioni. Ma ci sono sempre 6 operazioni, più la moltiplicazione, più un ulteriore spostamento e l'accesso all'array gestito (cioè il controllo dell'indice). Quindi la tua versione sarà ovviamente più lenta per velocità :).
E la tua versione, naturalmente, sembra misteriosa).
p.s. Ho un'ipotesi, che se il mio codice potesse essere srotolato in una catena di confronti via if-else, liberandosi di tutte le operazioni aritmetiche, velocizzerebbe enormemente le cose. Ma sarebbe un gran casino di codice. Se solo si potesse usare la ricorsione nelle macro...
(stanco) se questo fosse il problema, l'errore "'k' - redefinition; different type modifiers" apparirebbe, ma non è nello screenshot. Quindi al compilatore non interessa e non è questo il problema.
Bene, bene...
Bene, bene...
Beh, provate a compilarlo voi stessi. Se non sei troppo pigro per scrivere post su questo argomento sul forum, dovresti essere troppo pigro per metterlo in un editor e premere F7. È molto più veloce.
Modo veloce per calcolare il logaritmo binario di un intero. Funziona 3-5 volte più veloce di MathLog.
Modo veloce per calcolare il logaritmo binario di un intero. Funziona 3-5 volte più veloce di MathLog.
Io uso una funzione come questa (puro sciamanesimo, ma funziona):
Entrambe le funzioni danno la stessa risposta corretta, non ho trovato errori.
È interessante confrontare la velocità di funzionamento. La mia versione ha un po' meno operazioni di spostamento e di addizione, ma c'è la moltiplicazione alla fine. La versione di Alexey ha un po' più operazioni di spostamento e di addizione, ma nessuna moltiplicazione. In che modo è più veloce?
La mia versione ha un po' meno operazioni di spostamento e di addizione, ma non di moltiplicazione; quella di Alexey ha un po' più operazioni di spostamento e di addizione, ma non di moltiplicazione. In che modo è più veloce?
Ho un massimo di 6 operazioni di shift e di addizione (ricerca binaria).Shift (ulong)1<<k non conta, perché è una costante. L'unica cosa è che controlliamo anche le condizioni. Ma ci sono sempre 6 operazioni, più la moltiplicazione, più un ulteriore spostamento e l'accesso all'array gestito (cioè il controllo dell'indice). Quindi la tua versione sarà ovviamente più lenta per velocità :).
E la tua versione, naturalmente, sembra misteriosa).
p.s. Ho un'ipotesi, che se il mio codice potesse essere srotolato in una catena di confronti via if-else, liberandosi di tutte le operazioni aritmetiche, velocizzerebbe enormemente le cose. Ma sarebbe un gran casino di codice. Se solo si potesse usare la ricorsione nelle macro...
È interessante confrontare la velocità.
La variante log2 è più veloce.
Quindi l'opzione log2 è più veloce.
Capito.
Sostituzione della mia funzione.