как быстро получить номер старшего знач. бита в лонге
От: Аноним  
Дата: 17.11.05 12:32
Оценка:
1. можно двигать вправо пока не станет единицей
2. если диапазон значений лонга небольшой можно сделать таблицу

а есть еще способы?
Re: как быстро получить номер старшего знач. бита в лонге
От: Аноним  
Дата: 17.11.05 12:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>1. можно двигать вправо пока не станет единицей

А>2. если диапазон значений лонга небольшой можно сделать таблицу

А>а есть еще способы?


i. Сбросить все биты кроме старшего
ii. Проверить по таблице, размерность таблицы зависит от разрядности типа long.
В любом случае таблица невелика будет
Re: как быстро получить номер старшего знач. бита в лонге
От: korzhik Россия  
Дата: 17.11.05 12:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>1. можно двигать вправо пока не станет единицей

А>2. если диапазон значений лонга небольшой можно сделать таблицу

А>а есть еще способы?


здесь
Re: как быстро получить номер старшего знач. бита в лонге
От: saproj  
Дата: 17.11.05 12:50
Оценка:
Составить таблицу из 32 значений:
1
2
4
8

16
...

Потом двоичным поиском за 5 сравнений можно получить ответ. Например, если значение попадает в [8, 16), то старший бит — 3.
Re: как быстро получить номер старшего знач. бита в лонге
От: korzhik Россия  
Дата: 17.11.05 12:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>1. можно двигать вправо пока не станет единицей

А>2. если диапазон значений лонга небольшой можно сделать таблицу

А>а есть еще способы?


http://www.rsdn.ru/Forum/Message.aspx?mid=261472
Автор: VladD2
Дата: 07.05.03
Re: как быстро получить номер старшего знач. бита в лонге
От: _Winnie Россия C++.freerun
Дата: 17.11.05 13:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>1. можно двигать вправо пока не станет единицей

А>2. если диапазон значений лонга небольшой можно сделать таблицу

А>а есть еще способы?


Посмотри в Winnie Alloc Library.

Я тестировал много способов, в том числе ассембленую команду bsr и всякие хитрые бит-хаки. способ с таблицей оказался самый быстрый.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: как быстро получить номер старшего знач. бита в лонге
От: Dmi_3 Россия  
Дата: 17.11.05 19:52
Оценка:
Здравствуйте, 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;
}
Re[3]: как быстро получить номер старшего знач. бита в лонге
От: saproj  
Дата: 18.11.05 08:21
Оценка:
Здравствуйте, Dmi_3, Вы писали:

D_>За 5 сравненй дающих 2 варианта нельзя выбрать один из 33 ответов.


Если значение нулевое, то старшего единичного бита нет вообще . Вместе с проверкой на 0 получится конечно 6 сравнений.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.