Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2012, 21:10   #1
Lasur
Форумчанин
 
Аватар для Lasur
 
Регистрация: 13.10.2011
Сообщений: 143
По умолчанию Максимальный индекс 1 в битовом виде числа(Int32)

Нужно узнать максимальный индекс/номер (считая справа, от меньшего) единицы в битовом виде у UInt32/Int32, то есть у последовательности из 4 байтов. Например,
x = 00000000 00000000 00100110 00001110
индекс = 13 (считая с 0)


Проблема, уверен, не нова. Алгоритм, разумеется, нужен быстрый. Единственное, что придумал, сдвигать вправо, пока x != 0 и считать кол-во сдвигов.
Все имена, фамилии, ники, даты и события упоминаемые в моих постах, являются вымышленными. Все совпадения с реально существующими - случайны.
Lasur вне форума Ответить с цитированием
Старый 06.04.2012, 21:31   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Мне кажется, вполне нормальный алгоритм.
В том же ассемблере есть команда для возврата такого номера, но она, вроде, работает медленнее, чем метод со сдвигом.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.04.2012, 21:34   #3
Lasur
Форумчанин
 
Аватар для Lasur
 
Регистрация: 13.10.2011
Сообщений: 143
По умолчанию

Метод со сдвигом использует цикл while и для моих нужд работает явно не достаточно быстро. Желательно какую-то идею без циклов.
Все имена, фамилии, ники, даты и события упоминаемые в моих постах, являются вымышленными. Все совпадения с реально существующими - случайны.
Lasur вне форума Ответить с цитированием
Старый 06.04.2012, 22:07   #4
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Генри Уоррен "алгоритмические трюки для программистов" глава 6
а вообще, неужели bsr/bsf так медленны? что-то даже я тормозов не заметил, хоть весьма серьёзно к скорости отношусь
GreenWizard вне форума Ответить с цитированием
Старый 06.04.2012, 22:10   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Сделать ассемблерную вставку?)
Только не обязательно ускорится.

GreenWizard, да, вы правы, конечно не медленны
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.04.2012, 22:23   #6
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

делал как-то я сравнение строк блоками по 4 байта (прототип для сравнения по 16 на sse)... писал на Паскале, а асм-код вовсе отдельной функцией... даже при таком расклад ускорение 3-3.5 раз т.е. bsr/bsf очень хороший вариант... скорость приемлемая и нет мороки с алгоритмом
если проблемы возникают, то в 90% случаев из-за подхода самого
GreenWizard вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для числа X проверить возможность представления данного числа в виде заданной степенной функции. migraine Помощь студентам 0 06.12.2011 22:01
Составить программу которая находит индекс числа в массиве случайных чисел MadNikys Помощь студентам 9 03.03.2010 20:52
Индекс числа VenomMag55 Помощь студентам 2 09.02.2010 16:09
Как числа в двоичном виде вывести в столбик по 4 числа? Equalizer Общие вопросы C/C++ 11 27.09.2009 14:15
Даны числа от 100 до 999. Вводится индекс... Ci_novice Помощь студентам 4 19.04.2008 12:59