187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
||||||
1 | ||||||
Модульное деление на степень двойки04.12.2012, 14:30. Показов 7299. Ответов 25
Метки нет (Все метки)
Раньше я всегда использовал примерной такой подход :
Вопрос : в чем плох такой подход и как правильно? Скорее всего, компиляторы сами производят подобную оптимизацию, но всё же.
0
|
04.12.2012, 14:30 | |
Ответы с готовыми решениями:
25
Вычислить 10-ю степень двойки сложением, умножением и просто возведением в степень. степень двойки Степень двойки Точная степень двойки |
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
04.12.2012, 15:29 | 2 |
А чего ты хотел то? Что вообще значит твой исходник? Какую задачу ты решал?
0
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
04.12.2012, 15:48 [ТС] | 3 |
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
04.12.2012, 16:07 | 4 |
Издеваешься здесь ты.
1
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
04.12.2012, 16:13 [ТС] | 5 |
Где же? Что не понятного то? Как подход к умножению на степень двойки при помощи битовых сдвигов, есть и обратный подход для деления и деления с остатком, то есть деления по модулю. Я привел листинг, как это делал я раньше. Некто сказал мне, что такой подход не верен в некоторых случаях. Я задал вопрос, когда этот листинг может быть не верен и почему, а так же попросил привести верный листинг.
А теперь новый вопрос : где здесь издевательство? Что здесь не понятно?.. Ей богу, только настроение испортили.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
04.12.2012, 16:15 | 6 |
И где у тебя сдвиги? Кроме того, что на что ты собирался делить, где у тебя результат и при чём здесь вообще типы из твоего поста не понятно.
0
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
04.12.2012, 16:38 [ТС] | 8 |
WhiteP, % выполняет обычное деление по сути. Так как модуль в данном случае степень двойки, то можно написать более быстрое модульное деление. Поэтому и не устраивает обычный %. Но, как я написал, компиляторы, наверное, справляются с этим. Только как..
0
|
836 / 343 / 67
Регистрация: 20.11.2012
Сообщений: 795
|
||||||||||||||||
04.12.2012, 16:48 | 9 | |||||||||||||||
Написал тестовый пример.
Результат:
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
04.12.2012, 16:54 | 10 |
0
|
836 / 343 / 67
Регистрация: 20.11.2012
Сообщений: 795
|
|
04.12.2012, 16:56 | 11 |
taras atavin,
на уровне ассемблера производится деление (idiv) при котором в одном регистре - частное, а в другом остаток. Когда нам нужно частное - выдается один регистр, а когда остаток - другой. Операция же одна и та же.
1
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
04.12.2012, 16:57 [ТС] | 12 |
WhiteP, хм, сам не проверял, лишь слышал, что компиляторы давно уже научились a*16, b/32 и c%256 заменять на быстрые эквиваленты. То ли с модулем всё не так, то ли врали мне ;/
И всё же вопрос остался. В каких случаях листинг из первого сообщения выдает не правильный результат и как надо?
0
|
11 / 11 / 0
Регистрация: 19.03.2010
Сообщений: 101
|
|
04.12.2012, 16:57 | 13 |
Ваш код тоже вычисляет остаток деления от степени двойки
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
04.12.2012, 16:58 | 14 |
Да. Но % не возвращает результат из регистра с частным, он возвращает только остаток.
0
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
04.12.2012, 16:59 [ТС] | 15 |
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
04.12.2012, 17:00 | 16 |
Сначала опиши задачу и объясни, где у тебя исходные данные, а где результат. И какое данное где.
Добавлено через 1 минуту Деление он не выполняет, он возвращает остаток. Побочный низкоуровневый результат в виде частного при этом теряется.
0
|
11 / 11 / 0
Регистрация: 19.03.2010
Сообщений: 101
|
||||||
04.12.2012, 17:01 | 17 | |||||
a=20(10100) делим на 16 mod=16(1000) 1000-1= 0111 получаем 10100 & 00111 _____ 00100 = 4
1
|
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
04.12.2012, 17:03 [ТС] | 18 |
Sanyur, я думал это и так понятно..
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
04.12.2012, 17:04 | 19 | |||||
Будет глючить в том случае, если mod не равно целой степени двойки, если же делать проверку, то на ней потеряешь ещё больше. Вывод: применять только в тех случаях, когда априорно известно, что делитель равен целой степени двойки. И можно даже так:
0
|
836 / 343 / 67
Регистрация: 20.11.2012
Сообщений: 795
|
||||||
04.12.2012, 17:10 | 20 | |||||
Просто операция деления одна из самых затратных по времени (на уровне тактов, конечно)
Добавлено через 4 минуты Если константой заменить (a % 8), то вот так оптимизирует.
1
|
04.12.2012, 17:10 | |
04.12.2012, 17:10 | |
Помогаю со студенческими работами здесь
20
Максимальная степень двойки Точная степень двойки Найти степень двойки Степень двойки и остаток от деления Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |