Посл.ответ |
Сообщение |
 Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 10 апреля 2013 22:01 · Личное сообщение · #1
Дано signed int. Условия использовать нельзя. С помощью битовых операций нужно обнулить все биты кроме старшего сдвиги + - / * тоже можно. Уже голову сломал как сделать лучше.
----- have a nice day | Сообщение посчитали полезным: |
|
 Ранг: 158.5 (ветеран), 219thx Активность: 0.12↘0.01 Статус: Участник
|
Создано: 10 апреля 2013 22:03 · Поправил: ZaZa · Личное сообщение · #2
NimnulAND? 1100 1100 AND 1111 0000 = 1100 0000 1100 0000 AND 1100 0000 = 1100 0000 1100 0000 AND 1000 0000 = 1000 0000 Так сойдет? Nimnul пишет: Должен остаться только старший бит. Чую я, что как минимум без одного сравнения на ноль тут не обойтись... Перебирать в цикле по "И" от младшего к старшему байту, примерно так, как указано выше... Затем сравнивать на ноль, и если равно, тогда брать предыдущий результат. Теоретически - как-то так...
----- One death is a tragedy, one million is a statistic. | Сообщение посчитали полезным: |
 Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 10 апреля 2013 22:05 · Поправил: Nimnul · Личное сообщение · #3
Должен остаться только старший бит. 1001011 -> 1000000 0010101 -> 0010000
----- have a nice day | Сообщение посчитали полезным: |
 Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 10 апреля 2013 22:08 · Поправил: Nimnul · Личное сообщение · #4
И вопрос #2
Нужно убрать все условия зная что всегда a > b > c > d
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 301.4 (мудрец), 194thx Активность: 0.17↘0.01 Статус: Участник
|
Создано: 10 апреля 2013 22:14 · Личное сообщение · #5
не пробовал но как-то так
| Сообщение посчитали полезным: |
 Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 10 апреля 2013 22:16 · Поправил: Nimnul · Личное сообщение · #6
Veliantк сожалению асм использовать нельзя
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 301.4 (мудрец), 194thx Активность: 0.17↘0.01 Статус: Участник
|
Создано: 10 апреля 2013 22:20 · Личное сообщение · #7
Nimnul пишет: bsr использовать нельзя, не везде работает Под каких динозавров кодите? Они начиная с 386 появились
| Сообщение посчитали полезным: |
 Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 10 апреля 2013 22:28 · Личное сообщение · #8
Veliantя в том смысле что асм не везде можно юзать, а так да лучшее решение как всегда на асме
----- have a nice day | Сообщение посчитали полезным: |
 Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 10 апреля 2013 22:36 · Поправил: Nimnul · Личное сообщение · #9
По первому вопросу нашел довольно оригинальное решение 1 << ( int) log2( x);
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 301.4 (мудрец), 194thx Активность: 0.17↘0.01 Статус: Участник
|
Создано: 10 апреля 2013 22:42 · Поправил: Veliant · Личное сообщение · #10
тогда у меня для вас еще оригинальное решение
Чем не решение? В функции log2 может быть цикл с условиями
| Сообщение посчитали полезным: DimitarSerg, Nimnul |
 Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 10 апреля 2013 22:53 · Поправил: Nimnul · Личное сообщение · #11
Тоже не плохо но много букв )). Наверно лучшего решения нет
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 210.5 (наставник), 2thx Активность: 0.14↘0 Статус: Участник
|
Создано: 10 апреля 2013 23:01 · Личное сообщение · #12
Вот хороший материал по теме: http://graphics.stanford.edu/~seander/bithacks.html Там есть: Finding integer log base 2 of an integer (aka the position of the highest bit set)
| Сообщение посчитали полезным: Nimnul |
 Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 11 апреля 2013 00:08 · Поправил: Nimnul · Личное сообщение · #13
Все таки быстрейшее решение получилось на таблицах спасибо arnix. 100 миллионов операций за ~200 микросекунд. Думаю это близко к практическому потолку, и где то уже не далеко работает от лучшего решения на асме, которое показал Veliant. А задача #2 все еще актуальна.
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 15.3 (новичок), 118thx Активность: 0.01=0.01 Статус: Участник
|
Создано: 11 апреля 2013 01:02 · Личное сообщение · #14
Так можно:
http://ideone.com/acCzxu
| Сообщение посчитали полезным: |
Ранг: 53.9 (постоянный), 19thx Активность: 0.04↘0 Статус: Участник
|
Создано: 11 апреля 2013 06:29 · Поправил: Zorn · Личное сообщение · #15
Nimnul пишет: зная что всегда a > b > c > d В чем тогда смысл b и c ? RaMMicHaeL, а если "a" равно 0 ?
| Сообщение посчитали полезным: |
 Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 11 апреля 2013 09:56 · Личное сообщение · #16
ZornЯ забыл сказать что если a == 0 или другое то остальные числа не меньше нуля. Короче говоря задача найти большее из четырех. Как доп. бонус известно что a > b > c > d, но они могут быть равны 0, при этом остальные числа не меньше нуля например a = 0, b = 100, c = 50, d = 10 или a = 0, b = 0, c = 500, d = 100
----- have a nice day | Сообщение посчитали полезным: |
 Ранг: 527.7 (!), 381thx Активность: 0.16↘0.09 Статус: Участник Победитель турнира 2010
|
Создано: 11 апреля 2013 10:51 · Личное сообщение · #17
Задача #2 Идея найдена на просторах инета. Проверена, вроде работает.
----- 127.0.0.1, sweet 127.0.0.1 | Сообщение посчитали полезным: Nimnul |
 Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 11 апреля 2013 11:28 · Личное сообщение · #18
OKOB Работает но медленнее чем на ифах. За пример спасибо.
----- have a nice day | Сообщение посчитали полезным: |
 Ранг: 527.7 (!), 381thx Активность: 0.16↘0.09 Статус: Участник Победитель турнира 2010
|
Создано: 11 апреля 2013 15:36 · Личное сообщение · #19
Nimnul пишет: Работает но медленнее чем на ифах. Даже чисто ассемблерная реализация работает медленнее.
----- 127.0.0.1, sweet 127.0.0.1 | Сообщение посчитали полезным: Nimnul |