如何进行快速的内存块操作?(50分)

  • 主题发起人 主题发起人 tqz
  • 开始时间 开始时间
T

tqz

Unregistered / Unconfirmed
GUEST, unregistred user!
比如说:内存块复制可以用Move,整个内存块赋值可以用FillChar,
那么,对一个内存块进行某种位操作(比如and,or,xor...)有什么快速的
的方法呢?(别告诉我用两重循环)
 
是TBits类吧?
Tbits类目的是操作位(Bit),而且一次只能处理一位。如果处理大量数据,
恐怕还不如对每个字节做位操作效率高呢。
我希望在处理一个内存块时尽量不出现循环。不知道有没有可能?
 
哎,人心不足啊!!!!
TBits并不是快速的,只是方便的位操作类。
如果要快,还是用xor,and,or...吧。
它们是汇编指令在Delphi中的实现,已经极快了。——你可以加入Turbo
Debug调试信息,然后在TD中看一下就明白了。

用xor,and,or实现高速,重要的在算法,而不是指令。
——十六进制的运算算法??天啊,aimingoo已经吓得冒冷汗了! :)
 
比如说吧,我要把两幅位图做and操作,但是又不想用BitBlt,那怎么办才能达到
较高的效率呢?
 
用 汇编代码吧,反正delphi支持 inline asm
为什么不用bitblt???
 
我也建议用汇编码。
但你可以考虑对两块图的buf按word作and操作,
delphi会尽可能采用寄存器操作优化代码的。
 
如果想对两个位图作 And 操作, 不会有比 bitblt 更快的方法了
 
type
pinteger=^integer;

// 整块右移 shift=0-31
procedure shrb(var buffer
len: integer
shift: byte);
var
tail: integer;
temp1,temp2: inetger;
tailLen: byte;
P: pinteger;
i: integer;
begin
tailLen:=len and 3;
tail:=pinteger(pchar(@buffer)+len-taillen)^;
len:=len shr 2;
p:=pinteger(@buffer);
temp1:=0;
for i:=1 to len do
begin
temp2:=p^;
p^ := p^ shr shift or temp1;
temp1:=temp2 shl (32-shift);
p:=pinteger(pchar(p)+length(inetger));
end;
tail:=tail shr shift or temp1;
move(p^, tail, taillen);
end;

// 整块左移 shift=0-31
procedure shlb(var buffer
len: integer
shift: byte);
var
tail,temp1: integer;
tailLen: byte;
P: pinteger;
i: integer;
begin
tailLen:=len and 3;
tail:=pinteger(pchar(@buffer)+len-taillen)^and (-1 shl (32-taillen shl 3));
len:=len shr 2;
p:=pinteger(@buffer);
for i:=1 to len-1 do
begin
temp1:=pinteger(pchar(pointer(p))+4)^ shr (32-shift);
p^ := p^ shl shift or temp1;
p:=pinteger(pchar(pointer(p))+4);
end;
if len>0 then
begin
p^:=p^ shl shift or (tail shr (32-shift));
p:=pinteger(pchar(pointer(p))+4);
end;
tail:=tail shl shift;
move(p^, tail, taillen);
end;
 
我举例只是说明问题实质,不一定就是位图操作。
不知道有没有汇编指令支持整块位操作的,如果没有只好用嵌入汇编循环操作了。
或许可以这样,把两块内存作为两个位图的数据,然后BitBlt?hehe...
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部