![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с битовыми масками.
Riply © (2008-01-22 16:06:00)Здравствуйте !
Допустим, у нас есть две битовые маски.
Нам надо их сравнить и, если они различны, то выкинуть из каждой
те биты, которые есть в другой. Т.е. оставить только "отличающиеся".
У меня вот что получилось:
function DeleteEqualBits(const pBitMap1, pBitMap2: PRTL_BITMAP): DWord;
var
i: integer;
DWordCount, Tmp: DWord;
pdw1, pdw2: PULONG;
begin
Result := 0;
DWordCount := min(pBitMap1.SizeOfBitMap, pBitMap2.SizeOfBitMap) div 8;
if DWordCount > 0 then
begin
pdw1 := pBitMap1.Buffer;
pdw2 := pBitMap2.Buffer;
for i := 0 to Pred(DWordCount) do
if pdw1^ <> pdw2^ then
begin
Tmp := pdw1^ xor pdw2^;
pdw1^ := pdw1^ and Tmp;
pdw2^ := pdw2^ and Tmp;
inc(Result);
end;
end;
end;
Помогите, пожалуйста оптимизировать это безобразие,
если, конечно, оно того заслуживает :)
Семеныч (2008-01-22 16:15:00) [21]1. Делаем третью маску: Mask3 := Mask1 xor Mask2
2. Mask1 := Mask1 and Mask3; Mask2 = Mask2 and Mask3
===========
Под xor и and понимаются режимы работы BitBlt.
homm (2008-01-22 16:12:00) [22]> [0] Riply © (22.01.08 16:06)
> Нам надо их сравнить и, если они различны, то выкинуть из
> каждой те биты, которые есть в другой.
Не понятно, что значит выкинуть? Бит может быть установлен и сброшен.
Rouse_ (2008-01-22 16:12:00) [23]Тезка, а тебе не кажется что ты ксоришь только первые 4 байта масок в цикле? :)
DVM (2008-01-22 16:09:00) [24]
> Riply ©
PRTL_BITMAP у меня нет такого типа - это откуда?