Текущий архив: 2002.06.03;
Скачать: CL | DM;
Вниз
binary operations Найти похожие ветки
← →
AndreyS © (2002-05-22 14:25) [0]Подскажите пожалуйста как можно в Делфи наиболее производительно работать с двоичными
числами (у меня опыт только в С++). Вернее лучше сформулировать так. Нужно хранить в
динамической памяти массив единиц и нулей (тоесть неприрывный отрезок битов вплоть
до несколько сотен мегабайт); К каждому биту иметь доступ по адресу; "вырезать"
произвольный кусок от адреса такого то до такого то понимая его как двоичное число;
производить операции с двоичным числом максимально производительно (не плодя свои
заведомо медленные алгоритмы обработки и интерпритации) и заново побитно записывать
в нужные адреса (которые желательно вычислять тоже максимально производительно). В
Си есть прямо наборы встроенных удобных медодов и функций (вплоть для поиска
подкомбинаций в бит последовательностях). Вопрос не только в том как это можно на Делфи
сделать, а какие методы будут максимально производительны?
← →
PVOzerski © (2002-05-22 14:30) [1]Так всё то же самое, только операторы пишутся иначе:
and, or, xor, not, shl, shr...
Например:
a:=b shr 1;
c:=not d;
← →
erik © (2002-05-22 14:36) [2]Все числа в компюторе являются двоичными! В Delphi есть такое понятие Set of Byte или MyType (0.255) будут представлены как набор битов. Но искать придется по другому любую комбинацию битов можно представить числом и его искать скорее всего в масиве который будет подгружатся с диска(если конечно нет места в RAM) Почитай статьеи о использовании больших объемов памяти.
← →
AndreyS © (2002-05-22 14:39) [3]В ентом то все и дело. В С++ (посколько он позиционируется как низкоуровневый) по
этим вещам в любой книге все расписано. А шоб в Делфи по этому делу синтаксис,
особенности и функции выудить книгу поискать надо. Ведь не может же быть отсутствия
отличий и особенностей, а мне надо знать все до нюансов(ограничения типа - ведь
400 мегабайт). Может литературу посоветуете какую конкретную, больно уж не хочется по
аналогии выяснять где же все-таки разница. Кроме того я ищу литературу как можно работать с
железом на низком уровне в Делфи вплоть до портов , com, LPT и так далее.
← →
Внук © (2002-05-22 14:47) [4]Я бы сделал array of integer (или byte), потом SetLength, а дальше PVOzerski © (22.05.02 14:30). Только вот с поиском последовательностей битов придется повозиться.
← →
AndreyS © (2002-05-22 16:42) [5]Спасибо. Но это все достаточно очевидные решения. Я не даром говорю про максимальную
производительность. Ведь почти все предложенные вами способы требуют интерпретационного
алгоритма и лишних вызовов высокоуровнереализующих конвертационных решений компилятора
и переконвертаций и интерпретаций на уровне алгоритма. На это уходит масса времени (и она
существенна если расчет на месяцы). Вопрос в том как максимально сократить время на
операции и обработку двоичных чисел. Тоесть чтобы небыло никаких лишних преобразований
(типа перешифровки представлений). Нужно прямо указывать компилятору на интерпретацию в
двоичном виде и иметь доступ прямо к конкретно биту на низком уровне. Тоесть создание всяких
типов и массивов с последующей их интерпретацией это не производительно(все приводит к
лишним операциям на уровне компилятора или алгоритма). Понятно, что это возможно в
высокоуровневом языке если в него встроены соответсвующие низкоуровневые функции
согласованные с компилятором. Например так. Типа отвожу память от адреса такого то до такого
то (указатель). область такую то считать двоичным числом и таким его и обрабатывать.
результат записать в такую то область памяти. Тоесть функции реализующие побитовую работу
с памятью в прямом доступе и прямую работу с процессором может даже указания использовать
расширенные наборы инструкций проца. Прямую в смысле максимально приближенную. Если
в делфи это все сложно и функций таких нет, то так и скажите. Тогда мне на С все
писать придется. И еще кто может подсказать где нарыть инфу по работе с новыми
инструкциями процев.
← →
Внук © (2002-05-22 16:53) [6]Если бы Вы привели примеры интересующих сишных инструкций, я, наверное, смог бы написат их аналоги на Pascal или сказать, что их не существует. Я сильно сомневаюсь в том, что стандартный Си позволяет напрямую оперировать на уровне отдельных битов. IMHO, и процессор на это не способен, если не считать инструкций типа CLI и т.д.
← →
PVOzerski © (2002-05-22 17:32) [7]Есть же, к тому же, очевидные ограничения процессора. Вы знаете, например, ассемблерные команды для побитового присвоения? Или 1-битные регистры, скажем? А ведь любой язык программирования в итоге приводит к выполнению команд процессора. В случае же с битовыми операциями максимум, на что Вы можете рассчитывать - это на работу с 1-,2- и 4-байтными блоками "за один приём". Независимо от выбранного языка высокого уровня.
← →
erik © (2002-05-22 17:53) [8]to AndreyS
Помоему тут дело не в алгоритме, наиболее короткий путь тот который знаеш! Так что пиши на C++ и не мучайся. Ты всеравно Delphi неосвоиш за 2 недели, если незнаеш что там нет интерпритации! И все функции низкоуровневые. А если осталось желание то бери типизированые указатели и вперед. Типа
PByteArray = ^TByteArray;
TByteArray: Array of byte;
А налогично для Cardinal и Int64 А работу с указателяим ты должен знать.
Сылки:
Некоторые особенности организации данных, требующих больших объемов оперативной памяти.
http://www.delphikingdom.com/mastering/biglist.htm
← →
AndreyS © (2002-05-22 18:16) [9]Точно названия сишных функций не помню (книжка дома) поэтому не буду пытаться давать
неточные. В Страуструпе (извиняюсь за ехидную переделку фамилии) и полном
справочнике по си они есть. Кроме того- Я ведь делал уточнение - "максимально
приближенную". Конечно, совсем низкоуровневые операции можно будет делать
только на асме. Но возможны и варианты. Например функция позволяющие довести
обработку двоичных чисел и работу с памятью до приемлемого уровня удобства и не
шагу дальше в ущерб быстродействию. Конечно придется с блоками работать и все-равно
городить некий алгоритм анализа и конвертации, но в этом случае он будет короче и
быстрее. Вопрос и был в максимально, а не полностью, приближенных к этому функциях,
если они есть конечно. Лучше просто книжку подсказать более близкую к этому или
адресок в сети, а то на обсуждение таких частностей места и времени не хватит. Что
касается примеров: в си есть функция например позволяющая найти битовую
подпоследовательность(именно битовую- другой вопрос как она реализована). Яж о
функциях и спрашиваю, которые на асме и реализованы, а не о том, как минуя спецсредства
сделать что то на языке высокого уровня.
← →
AndreyS © (2002-05-22 18:25) [10]Erik, спасибо за ссылку
Страницы: 1 вся ветка
Текущий архив: 2002.06.03;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.013 c