Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
3-6903
KVT2002
2002-05-13 09:47
2002.06.03
Отмена изменений в DBGrid, как в Word e


8-7112
MC TOL
2002-01-03 10:24
2002.06.03
Вопросик по OpenGL


14-7210
vopros
2002-04-26 15:44
2002.06.03
Взялся за работу называется.


1-7088
VS2001
2002-05-22 11:28
2002.06.03
Как записать определенные данные в готовый бланк на Excel


1-6987
Kopachev
2002-05-22 21:51
2002.06.03
В чем я не прав