Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/55: Рейтинг темы: голосов - 55, средняя оценка - 4.58
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263

Побитовые операции с памятью

16.03.2020, 18:01. Показов 12637. Ответов 150
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть ли в Delphi какие-нибудь функции чтобы побитово сделать and or xor not с двумя произвольными кусками памяти? Можно чтобы это были обязательно два равных по длине куска, неважно.
Например для сравнения двух кусков есть очень быстрая функция CompareMem.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.03.2020, 18:01
Ответы с готовыми решениями:

Побитовые операции
Задание: Дано целое неотрицательное число. Определить количество составляющих его шестнадцатеричных цифр, содержащих в двоичном...

Побитовые операции
С помощью побитовых операций преобразовать число -78 в 15 Вот что пыталась делать, кто знает как сделать? int v =-78; int i = 1; ...

побитовые операции
написать програму умножения двух однобайтных чисел, используя только операции однобайтного умножения, прибавления, отнимания и сдвига....

150
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
27.03.2020, 20:07
Студворк — интернет-сервис помощи студентам
В общем написал поиск картинки с альфа-каналом на AVX-512 (пока только для картинок с шириной кратной 16 пикселям). Для Delphi 7 после компиляции asm-файла FASM`ом нужно конвертнуть получившийся coff в omf (я использовал obhconv с ключом -fomf). Мой процессор не поддерживает AVX-512, тестировал через SDE.

Для корректной работы битмапы должны быть 32-битными (0-прозрачный цвет, 255 - непрозрачный, других значений быть не должно). Ширина сэмпла должна быть кратна 16 рикселям.

Рабочая демка для Delphi 7 во вложении.
Вложения
Тип файла: 7z AVX512.7z (157.6 Кб, 17 просмотров)
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
28.03.2020, 04:13  [ТС]
murderer, При попытке вызова функции вылазит ошибка EExternalExeption C000001D. Я проделал всё шаги ещё раз, то есть скомпилил фасмом и конвертнул, но результат тот же самый. Попытался на RAD Studio 10.1 скомпилить, тоже самое. Мой получается тоже не поддерживает AVX-512?

Добавлено через 5 минут
В CPU-Z например просто AVX.
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
28.03.2020, 05:31
Не поддерживает. Просто AVX довольно бесполезная штука, для поиска картинок нужен хотя бы AVX2. Сейчас перепишу на SSE2.
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
28.03.2020, 06:31
Вот вариант на SSE2, попутно исправил баг, который проявлялся при задании прямоугольника поиска (x,y,dx,dy). Ширина сэмпла должна быть кратна 4 пикселям.
Вложения
Тип файла: 7z SSE2.7z (157.3 Кб, 20 просмотров)
1
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
28.03.2020, 07:27  [ТС]
Спасибо. А нужны обязательно 32битные битмапы? Недостаточно после загрузки сделать Src.PixelFormat:=pf32bit; Sample.PixelFormat:=pf32bit; ? Попробовал свои картинки - не ищет. Перегнал фотошопом в 32 бит - всё равно не находит. Ну, или как вариант находит но не там)
Вложения
Тип файла: rar 1.rar (3.44 Мб, 9 просмотров)
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
28.03.2020, 07:33  [ТС]
Delphi
1
2
3
4
5
6
7
8
9
Src:=TBitmap.Create;
Src.LoadFromFile('d:\_300GB\Desktop\1\rosrc32.bmp');
Src.PixelFormat:=pf32bit;
Sample:=TBitmap.Create;
Sample.LoadFromFile('d:\_300GB\Desktop\1\ro32.bmp');
Sample.PixelFormat:=pf32bit;
 
point:=FindInRegionMass(Src.Handle,0,0,Src.Width,Src.Height,Sample.Handle);
Form1.Caption:=IntToStr(Point.X)+'x'+IntToStr(Point.Y);
Добавлено через 5 минут
Битмап всегда выровнен так, чтобы количество байт в сканлайне было равным четырём. Я когда-то выдирал и конвертировал разные иконки, и писал функции для считывания всех включая палитровые.
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
28.03.2020, 07:58
Альфа канал в целевом изображении должен быть забит числом $FF. В сэмпле альфа должна принимать только два значения: 0 - прозрачный, 255 - не прозрачный.

Добавлено через 2 минуты
Битмап всегда выровнен так, чтобы количество байт в сканлайне было равным четырём
Мой код сравнивает по 4 пикселя (16 байт). Ширина сэмпла должна быть кратна 4 пикселям (любой сэмпл можно привести к такой ширине просто добавив прозрачные пиксели).
1
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
28.03.2020, 08:15  [ТС]
murderer, Ого, огромное спасибо. Твой код отрабатывает мгновенно. Реально за 1мсек) У меня альфаканал у скриншота забивается $FF намного дольше)
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
28.03.2020, 08:15
Вот как можно быстро заполнить альфа-канал (обрати внимание я не использую сканлайны):
Delphi
1
2
3
4
5
6
7
8
9
10
11
var
  i,j:    integer;
  bmp:    Bitmap;
  pixels: array of dword;
begin
  GetObject(Image1.Picture.Bitmap.Handle,sizeof(BITMAP),@bmp); //Получаем инфу о битмапе
  pointer(pixels):=bmp.bmBits;                                 //Теперь pixels указывает на растр битмапа (он отражён в памяти по вертикали)
  for i:=bmp.bmWidth*bmp.bmHeight-1 downto 0 do
    pixels[i]:=pixels[i] or $FF000000;                         //Заполняем альфа-канал
  pointer(pixels):=0;                                          //Обязательно обнуляем указатель, иначе Delphi попытается вызвать FreeMem, чтобы освободить динамический массив и это закончится крахом
end.
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
28.03.2020, 08:18  [ТС]
murderer, А делать GetObject обязательно, если я использую не TImage а TBitmap?
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
28.03.2020, 08:26
Можно получить указатель на растр так:
Delphi
1
pointer(pixels):=Bitmap.ScanLine[Bitmap.Height-1];
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
28.03.2020, 08:33  [ТС]
У меня почему-то в процессе AccessViolation выдаёт. Сейчас подумаю где ошибка.
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
28.03.2020, 08:40
Может вылетать на инструкции movdqa если окажется, что растр сэмпла не выровнен по границе 16 байт. Тогда просто замени на movdqu.
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
28.03.2020, 08:47  [ТС]
Оно отрабатывает правильно, всё находит что надо, но почему-то на выходе из FormCreate вылетает если заполнять через bmp.bmBits.
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
28.03.2020, 08:49
Не забыл обнулить указатель?
Delphi
1
pointer(pixels):=0;
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
28.03.2020, 08:55  [ТС]
О_о забыл, а что надо было?

Добавлено через 2 минуты
Блин, это очень круто! Спасибо! А почему через bmp.bmBits работает быстрее в тысячу раз чем через сканлайны?
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
28.03.2020, 09:00
Тут я в комментах даже объяснил почему это обязательно - https://www.cyberforum.ru/post14373533.html

Добавлено через 4 минуты
Дело даже не в сканлайнах, а в том, что ты постоянно вызываешь метод TBitmap.GetScanLine внутри цикла. Это нужно делать один раз перед циклом. Не важно как будет получен указатель, главное не делать лишних движений в цикле.

Этот код будет работать наверное даже быстрее чем GetObject.
Delphi
1
pointer(pixels):=Bitmap.ScanLine[Bitmap.Height-1];
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
28.03.2020, 09:04  [ТС]
А альфаканал нужен только для выравнивания?
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
28.03.2020, 09:07
По сути да. Это сильно упрощает код - можно просто сравнивать 4 пикселя через pcmpeqd.
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
28.03.2020, 09:08  [ТС]
А какого цвета цвет прозрачности у кота? У меня с фуксией не ищет(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.03.2020, 09:08

Побитовые операции
Выбрать алгоритм, составить его блок-схему и программу для решения выбранного варианта задания. Во всех вариантах предполагается, что...

Побитовые операции
Всем доброго утра. Дана такая задача: есть два чсила,поменять местами 2 последние цифры этих чисел между собой, т.е. 2 последних Х заменить...

Побитовые операции
От друга услышал идею о побитовой сортировки имен (например). К примеру, если у нас набор структурных переменных с анкетами работников, и...

Побитовые операции
Задача: битовый образ 8*8 задается при помощи 8 байт, каждый байт состоит, соответственно, из 8 бит, бит={0,1}; при помощи побитовых...

Побитовые операции
Помогите решить несколько задач по битовым операциям,они все малы по реализации. И объяснить начиная с 3 задачи,что нужно сделать?А то не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru