1. можно двигать вправо пока не станет единицей
2. если диапазон значений лонга небольшой можно сделать таблицу
а есть еще способы?
Здравствуйте, Аноним, Вы писали:
А>1. можно двигать вправо пока не станет единицей
А>2. если диапазон значений лонга небольшой можно сделать таблицу
А>а есть еще способы?
i. Сбросить все биты кроме старшего
ii. Проверить по таблице, размерность таблицы зависит от разрядности типа long.
В любом случае таблица невелика будет
Здравствуйте, Аноним, Вы писали:
А>1. можно двигать вправо пока не станет единицей
А>2. если диапазон значений лонга небольшой можно сделать таблицу
А>а есть еще способы?
здесь
Составить таблицу из 32 значений:
1
2
4
8
16
...
Потом двоичным поиском за 5 сравнений можно получить ответ. Например, если значение попадает в [8, 16), то старший бит — 3.
Здравствуйте, Аноним, Вы писали:
А>1. можно двигать вправо пока не станет единицей
А>2. если диапазон значений лонга небольшой можно сделать таблицу
А>а есть еще способы?
http://www.rsdn.ru/Forum/Message.aspx?mid=261472Автор: VladD2
Дата: 07.05.03
Здравствуйте, Аноним, Вы писали:
А>1. можно двигать вправо пока не станет единицей
А>2. если диапазон значений лонга небольшой можно сделать таблицу
А>а есть еще способы?
Посмотри в
Winnie Alloc Library.
Я тестировал много способов, в том числе ассембленую команду bsr и всякие хитрые бит-хаки. способ с таблицей оказался самый быстрый.
Здравствуйте, saproj, Вы писали:
S>Составить таблицу из 32 значений:
S>Потом двоичным поиском за 5 сравнений можно получить ответ.
За 5 сравненй дающих 2 варианта нельзя выбрать один из 33 ответов.
Если число известно заранее можно вычислить логарифм так:
template<unsigned long N>
struct lg{
enum{ result = lg<N/2>::result + 1 };
};
template<>
struct lg<0ul>{
//В числе ноль нет установленных в единицу бит.
enum{ result = -1 };
};
int main(){
enum{num=12345};
std::cout << num << std::endl;
std::cout << lg<num>::result << std::endl;
}
Здравствуйте, Dmi_3, Вы писали:
D_>За 5 сравненй дающих 2 варианта нельзя выбрать один из 33 ответов.
Если значение нулевое, то старшего единичного бита нет вообще

. Вместе с проверкой на 0 получится конечно 6 сравнений.