![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Берёшь своё число, определяешь следущую степень двойки, отнимаешь еденицу и делаешь &
где то так "с лёту" |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
В итоге i содержит номер старшей еденицы числа х, только х конечно же беззнаковое (для операции сравнения), а не знаковое, как было заявлено. |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
тоже самое, только быстрее.
Это сообщение отредактировал(а) LuckLess - 4.5.2006, 17:43 |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
точно быстрее? мой цикл требует 7 итераций а твой 9 (7+9=16==sizeof(short))
|
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
посмотри сам.
во первых твой вариант давал неправельный результат. надо было в конце еще 1 битовый здвиг делать в обр. сторону. во вторых твой вариант не может работать с маской unsigned short , так как она переполняеться!! поэтому в примерах маска 4 байта. сделал и себе маску 4 байты , так как если сделать ее 2 , то вычисления становяться медленнее в 4-5 раз, чего и следовало ожидать. вот сравни результаты.
|
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
На счет переполнения - согласен, лучше маску делать с запасом.
Что касается дополнительного сдвига, то это зависит от того, что ты потом с этой маской будешь делать. Нам ведь нужна такая маска: ....10101010, а как ее получить в твоем алгоритме? Ведь не на основе же вычесленной mask'и. Скорость твоего варианта больше (в основном благодаря замене сравнения битовой операцией), это так. Но надо решить всю задачу целиком и сравнить, тогда и посмотрим. ЗЫ !(x&mask) - хорошо придумал, я бы так просто не догадался. |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
чесно говоря я уже забыл зачем мы ее считали эту маску))
приду домой минут через 30, напишу полностью задачу)) и ты напиши. сравним скорости )) |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
вот
Это сообщение отредактировал(а) LuckLess - 4.5.2006, 19:34 |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
мой вариант:
|
|||
|
||||
| likehood |
|
||||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
Кстати, отличная идея - взять полную маску 0х5555 и обрезать нужное число разрядов.
Я то сначала хотел получать эту маску по одному биту в цикле, а тут взял...
...и никаких проблем! Добавлено @ 21:34 Что касается скорости, твой вариант где-то в 1.5 раза быстрее, так что и вправду лучше начинать со старших разрядов. Правда в твоем коде есть одна неточность, из-за чего иногда получается неверный результат. Вот мой вариант твоего кода:
Кстати, только щас заметил пост sergej.z'а, как же я его проглядел? Отличная идея - вычесть из маски 1 - намного красивее моего варианта. Но Func2 все же должен работать быстрее. |
||||
|
|||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
я чуть переделал.
так как с ошибкой было у меня моя функция выиграывет почти в 8 раз
Это сообщение отредактировал(а) LuckLess - 4.5.2006, 21:46 |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
Выигрыш, конечно, зависит от компилера и его настроек, но все равно разница очевидна.
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
а так?
-------------------- qqq |
|||
|
||||
| Streng |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
Большое спасибо за помощь!!!
|
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
maxim1000,
результаты
8000 1000 2000 т.е. моя функция пока впереди планеты всей |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |