|
|
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAleksandr SharahovВ константе $10010000 старшая единица ставит на место биты 0..3, младшая - биты 8..11, т.е. переставили. Логически я это понимаю. Не могу самостоятельно в случае чего просчитать такую константу. Вот есть число 00000X0Y Необходимо получить YX~~~~~~ Соответственно Y нужно поместить на место 28 бита, X нужно поместить на 24 бит. Соответственно для Y у меня выходит константа $0001 shl 28 А для X я подставляю $0100 shl (24 - 8). И это не правильно. Расскажи, какой логикой руководствуешься, определяя константу. Туплю :) Важно не на какое место поставить, а на сколько битов сдвинуть с прежнего места. И если надо сдвинуть и на A и на B битов, то просто OR-им биты A и B и получаем константу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 00:00 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Оки А как просчитать, не затрут ли биты друг друга Ну вот пример Есть число 000А0БВГ Каждая «буква» это 4 бита. Допустим, я хочу взять от каждой буквы по 3 бита и занять верхние 12 бит. По изложенному принципу я сформирую константу. Как я могу однозначно определить, глядя на константу, что написанная мной операция работает для любых АБВГ? И ещё момент. Насколько я понял, принцип предполагает расположение элементов в обратном порядке? Т.е. сохранить порядок элементов не удастся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 01:07 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAleksandr Sharahov, Оки А как просчитать, не затрут ли биты друг друга Ну вот пример Есть число 000А0БВГ Каждая «буква» это 4 бита. Допустим, я хочу взять от каждой буквы по 3 бита и занять верхние 12 бит. По изложенному принципу я сформирую константу. Как я могу однозначно определить, глядя на константу, что написанная мной операция работает для любых АБВГ? Тупо считаем, как описано. Берем худший случай - все 1. Проверяем наложение. Если оно есть, начинаем дополнительно изворачиваться при помощи масок, чтобы сделать по частям. SOFT FOR YOUИ ещё момент. Насколько я понял, принцип предполагает расположение элементов в обратном порядке? Т.е. сохранить порядок элементов не удастся. Если внимательно посмотришь на произведение, в нем всегда есть все возможные порядки. А порядок расположения и наличие битов в нужном месте определяется коэффициентом (т.е. заданными тобой сдвигами). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 09:42 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2018, 09:48 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Спасибо тебе за познавательную лекцию Кстати я так и не разобрался, как расчитывать константу и сдвиг для целочисленного деления. Причём там целая кипа особенностей: * если Cardinal делится на Cardinal - там один код * причём результат может не убраться в нижние 32 бита - тогда приходится делать умножение в Int64 - и смотреть старшие 32 бита * если Integer делится на Cardinal - то там используется корректировка в зависимости от знака * если Integer делится на отрицательное - я не знаю, можно ли обойтись без операции neg * не всегда понятно, удастся ли обойтись imul или нужен mul Сейчас я обхожусь полным перебором, нахожу подходящие константы. Например, если X в диапазоне 0..9999, то его деление на 100 у меня выглядит так: (X * $147B) shr 19 Но всё это не серьезно. Хочется иметь динамическое решение. Так что если напишешь толковую статью по сему поводу - цены тебе не будет :) Кстати через FPU тоже вариант, но выполняется дольше, и вопросы по точности. Поэтому если есть возможность решать через целочисленные регистры - я стараюсь делать через них. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2018, 15:43 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2018, 17:06 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, о много нам открытий чудных готовит просвещенья дух Александру спасибо. Твои алгоритмы всегда были лучшими :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2018, 17:31 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUполным перебором, нахожу подходящие константы ...а это уже полный перебор! Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2018, 21:40 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovSOFT FOR YOU, а это читал? http://guildalfa.ru/alsha/node/34 Видимо оно Почитаю на досуге :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2018, 21:56 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Статья конечно хорошая, но считаю её как минимум не полной. Вот к примеру Си-шный дизасм деления на 10: Код: sql 1. 2. 3. 4. 5. Конечно, можно сказать, что здесь двойная длинна, которую на чистом Delphi без ущерба производительности реализовать не удастся. Но во-первых, сейчас активно используют x64 и подобную манипуляцию совершат в два счёта. Во-вторых, при ограниченном диапазоне делимого - вполне можно реализовать деление через обычный imul и сдвиг, что я продемонстрировал на примере ранее. Немаловажно то, что делимое может и скорее всего будет со знаком. В этом случае логика сильно меняется, и заслуживает детального рассмотрения. Опять таки при ограниченном делимом наверняка можно делать "короткое" умножение. Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2018, 22:46 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAleksandr Sharahov, Статья конечно хорошая, но считаю её как минимум не полной. Вот к примеру Си-шный дизасм деления на 10: Код: sql 1. 2. 3. 4. 5. Конечно, можно сказать, что здесь двойная длинна, которую на чистом Delphi без ущерба производительности реализовать не удастся. Но во-первых, сейчас активно используют x64 и подобную манипуляцию совершат в два счёта. Во-вторых, при ограниченном диапазоне делимого - вполне можно реализовать деление через обычный imul и сдвиг, что я продемонстрировал на примере ранее. Немаловажно то, что делимое может и скорее всего будет со знаком. В этом случае логика сильно меняется, и заслуживает детального рассмотрения. Опять таки при ограниченном делимом наверняка можно делать "короткое" умножение. Код: sql 1. 2. 3. 4. 5. 6. 7. Во-первых, эти алгоритмы не вместо, а кроме. Во-вторых, у меня нет ограничения диапазона - перечитай, если не уловил это. В-третьих, и как ты тогда на x64 тогда будешь делить 64-битные? Там двойная длина 128 бит. Знак - это как раз хорошо, ты снова не въехал. Это свободный лишний бит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2018, 22:56 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Я не хотел унизить или оскорбить. Я указал на то, что статью имеет смысл доработать, раскрыв вопрос в полной мере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2018, 23:22 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAleksandr Sharahov, Я не хотел унизить или оскорбить. Я указал на то, что статью имеет смысл доработать, раскрыв вопрос в полной мере. Ну, ты же не понял самой сути. Предлагается ОРИГИНАЛЬНЫЙ, СОВЕРШЕННО НОВЫЙ, РАНЕЕ НИГДЕ НЕ ОПИСАННЫЙ АЛГОРИТМ. Так понятнее? Нафига описание нового алгоритма превращать в обзор существующих? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2018, 23:28 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Я понимаю, что ты хочешь явить миру изобретение. Но практический смысл его только в том случае, если человек не умеет сделать дизасм си-кода (я его кстати делал онлайн), реализовать обратное умножение через FPU, или подобрать константы перебором для своего диапазона чисел. Как минимум в двух случаях из трёх код выполнится быстрее. Согласен, у тебя универсальный способ, и с ассемблером, тем боле ARM, мучиться не нужно. Но если цель не только попиариться, а ещё и раскрыть тему деления, то без описанных мной выше нюансов - статью считаю не полной. Алгоритм в литературе раскрыт слабо или практически не раскрыт. У одного чувака псевдокод касался только Cardinal/Cardinal и вроде бы не работал, точно не помню. У второго только Integer/Integer, с сопутствующими ограничениями. Во всяком случае диапазон значений делимого не учитывался нигде, поэтому короткий вариант операции не был рассмотрен нигде. Может быть ты сталкивался с другой литературой. Но тем и хороши твои статьи, что написаны для людей. С примерами и рассуждениями. По крайней мере на то претендуют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2018, 23:52 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUМожет быть ты сталкивался с другой литературой. Довольно подробно известный алгоритм с двойной шириной описан и у Фога, и Уоррена (+ на сайте Уоррена есть дополнения). Для того чтобы понять идею и, используя шаблоны, написать деление самому без дизасма и перебора вполне достаточно. Останется только прогнать полную проверку написанного, ну, уж без этого никуда. Описывать то, что всем и так давно известно, в сотый раз совершенно не за чем. Все равно, чтоб получилось подробнее чем у Уоррена ни сил, ни умения, ни терпения не хватит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 00:11 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUЯ понимаю, что ты хочешь явить миру изобретение. Но практический смысл его только в том случае, если человек не умеет сделать дизасм си-кода (я его кстати делал онлайн), реализовать обратное умножение через FPU, или подобрать константы перебором для своего диапазона чисел. Как минимум в двух случаях из трёх код выполнится быстрее. Добавь сюда ИМХО, и я забуду этот бред. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 00:20 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, В смысле бред? Твоё деление на 10 выполняется дольше на 1 сдвиг, вычитание и операцию чтения из памяти, чем в сишном дизасме Моё (на диапазоне) деление на 100 делается вообще в две операции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 00:35 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUAleksandr Sharahov, В смысле бред? Твоё деление на 10 выполняется дольше на 1 сдвиг, вычитание и операцию чтения из памяти, чем в сишном дизасме Моё (на диапазоне) деление на 100 делается вообще в две операции Бред в том, что ты говоришь "Мне никогда не понадобится велосипед, я воспользуюсь автомобилем", как будто у тебя всегда под рукой есть автомобиль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 00:43 |
|
||
|
Поиск последовательности в бинарном массиве
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Та никто не говорит, что твой алгоритм никогда не понадобится Собственно и статьи твои обычно описывают то, что ранее кем-то было описано Я смотрю с практической точки зрения. Ранее ты разжёвывал и более хорошо описанные подходы. Сейчас деление NativeInt/UInt наиболее оптимально подсматривается в си-выхлопе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2018, 01:26 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39592114&tid=2041298]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
199ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 544ms |

| 0 / 0 |
