(устало) если бы в этом была проблема, то вылезла бы ошибка "'k' - redefinition; different type modifiers", но на скрине её нет. Значит компилятору все равно и дело не в этом.
Ну попробуйте сами откомпилировать. Если не лень посты писать на эту тему на форуме, должно быть не лень и загнать в редактор и нажать F7. Это гораздо быстрее.
Быстрый способ вычисления двоичного логарифма целого числа. Работает в 3-5 раз быстрее, чем расчёт через 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
}
Обе функции дают правильный одинаковый ответ, ошибок я не нашел.
Интересно сравнить скорость работы. В моем варианте - чуть меньше операций сдвига и сложения, но в конце есть умножение. В варианте Алексея - операций сдвига и сложения чуть больше, но умножения нет. Как быстрее ?
В моем варианте - чуть меньше операций сдвига и сложения, но в конце есть умножение. В варианте Алексея - операций сдвига и сложения чуть больше, но умножения нет. Как быстрее ?
У меня операций сдвига и сложения - не более 6 (бинарный поиск). Сдвиг (ulong)1<<k не считается, т.к. это константа. Единственное что там идёт ещё и проверка условия. У вас проверки условия нет, но зато операций всегда 6, плюс умножение, плюс ещё один сдвиг, плюс доступ к управляемому массиву (т.е. проверка индекса). Так что по скорости очевидно ваш вариант будет медленней - это и к бабке не ходи :)
Да и выглядит ваш вариант конечно мистически )
p.s. У меня есть предположение, что если мой код развернуть в цепочку сравнений через if-else, избавившись от всех арифметических операций, то можно получить колоссальное ускорение. Но это большая портянка кода получится. Вот если бы можно было использовать рекурсию в макросах...
(устало) если бы в этом была проблема, то вылезла бы ошибка "'k' - redefinition; different type modifiers", но на скрине её нет. Значит компилятору все равно и дело не в этом.
Ну-ну...
Ну-ну...
Ну попробуйте сами откомпилировать. Если не лень посты писать на эту тему на форуме, должно быть не лень и загнать в редактор и нажать F7. Это гораздо быстрее.
Быстрый способ вычисления двоичного логарифма целого числа. Работает в 3-5 раз быстрее, чем расчёт через MathLog.
Быстрый способ вычисления двоичного логарифма целого числа. Работает в 3-5 раз быстрее, чем расчёт через MathLog.
Я использую такую функцию (чистое шаманство, но работает):
Обе функции дают правильный одинаковый ответ, ошибок я не нашел.
Интересно сравнить скорость работы. В моем варианте - чуть меньше операций сдвига и сложения, но в конце есть умножение. В варианте Алексея - операций сдвига и сложения чуть больше, но умножения нет. Как быстрее ?
В моем варианте - чуть меньше операций сдвига и сложения, но в конце есть умножение. В варианте Алексея - операций сдвига и сложения чуть больше, но умножения нет. Как быстрее ?
У меня операций сдвига и сложения - не более 6 (бинарный поиск). Сдвиг (ulong)1<<k не считается, т.к. это константа. Единственное что там идёт ещё и проверка условия. У вас проверки условия нет, но зато операций всегда 6, плюс умножение, плюс ещё один сдвиг, плюс доступ к управляемому массиву (т.е. проверка индекса). Так что по скорости очевидно ваш вариант будет медленней - это и к бабке не ходи :)
Да и выглядит ваш вариант конечно мистически )
p.s. У меня есть предположение, что если мой код развернуть в цепочку сравнений через if-else, избавившись от всех арифметических операций, то можно получить колоссальное ускорение. Но это большая портянка кода получится. Вот если бы можно было использовать рекурсию в макросах...
Интересно сравнить скорость работы.
Таки вариант log2 быстрее.
Таки вариант log2 быстрее.
Понял.
Заменяю свою функцию.