Solved

Perform XOR operation on two binary blocks of memory ?

Posted on 2002-06-16
10
781 Views
Last Modified: 2010-05-18
Hello Experts,

How to perform a XOR operation on two binary blocks of memory?

Thanks!

P.S: The two memory blocks have the same size(about 2mb) but the data inside is different
0
Comment
Question by:navy_seal
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 2
  • 2
  • +2
10 Comments
 
LVL 11

Assisted Solution

by:robert_marquardt
robert_marquardt earned 147 total points
ID: 7083037
As simple as a for loop.

for I := 0 to SizeOf(Buffer1) do
  Buffer1[I] := Buffer1[I] xor Buffer2[I];

This may be a bit inefficient if the buffer elements are Chars.
Try using Cardinals as buffer elements.
0
 
LVL 7

Accepted Solution

by:
Cynna earned 148 total points
ID: 7083308
navy_seal,

I dig up somebodys old code. It's quite fast:

procedure MemBlockXOR(const Source1, Source2, Destination: Pointer;
                            Blocksize: Integer); assembler;
asm
  push edi
  push esi
  push ebx
  mov esi,eax
  mov edi,ecx
  mov ecx,Blocksize;
  mov eax,[esi]
  and eax,[edx]
  mov [edi],eax
  mov eax,[esi+4]
  and eax,[edx+4]
  mov [edi+4],eax
  add esi,ecx
  add edx,ecx
  add edi,ecx
  shr ecx,3
  test ecx,ecx
  jz @@ending
  neg ecx
@@doit:
  mov eax,[esi+ecx*8]
  mov ebx,[esi+ecx*8+4]
  xor eax,[edx+ecx*8]
  xor ebx,[edx+ecx*8+4]
  mov [edi+ecx*8],eax
  mov [edi+ecx*8+4],ebx
  inc ecx
  jnz @@doit
@@ending:
  pop ebx
  pop esi
  pop edi
end;


I tested it with:

procedure TForm1.Button1Click(Sender: TObject);
var Block1, Block2, Block3: Pointer;
    Size: Integer;
    t0: DWord;
begin
  try
     // Must be multiple of 4-bytes:    
     Size:=16*1024*1024; //16Mb
     GetMem(Block1, Size);
     GetMem(Block2, Size);
     GetMem(Block3, Size);
     FillMemory(Block1, Size, 2);
     FillMemory(Block2, Size, 3);
     t0:=GetTickCount;
       MemBlockXOR(Block1, Block2, Block3, Size);
     Button1.Caption:=IntToStr(GetTickCount-t0)+' ms';
  finally
     FreeMem(Block1);
     FreeMem(Block2);
     FreeMem(Block3);
  end;
end;

On my Athlon XP 1.4Ghz it XORed those 16Mb in 0.13 sec.

0
 
LVL 11

Expert Comment

by:robert_marquardt
ID: 7083333
I would guess that Delphi generates similar code.
The assembler code does a loop unroll to handle 2 DWORDs at once. That makes it "a multiple of 8-bytes".
The speed factor against my loop should be around 2x.
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 7

Expert Comment

by:Cynna
ID: 7083336
navy_seal,

I dig up somebodys old code. It's quite fast:

procedure MemBlockXOR(const Source1, Source2, Destination: Pointer;
                            Blocksize: Integer); assembler;
asm
  push edi
  push esi
  push ebx
  mov esi,eax
  mov edi,ecx
  mov ecx,Blocksize;
  mov eax,[esi]
  and eax,[edx]
  mov [edi],eax
  mov eax,[esi+4]
  and eax,[edx+4]
  mov [edi+4],eax
  add esi,ecx
  add edx,ecx
  add edi,ecx
  shr ecx,3
  test ecx,ecx
  jz @@ending
  neg ecx
@@doit:
  mov eax,[esi+ecx*8]
  mov ebx,[esi+ecx*8+4]
  xor eax,[edx+ecx*8]
  xor ebx,[edx+ecx*8+4]
  mov [edi+ecx*8],eax
  mov [edi+ecx*8+4],ebx
  inc ecx
  jnz @@doit
@@ending:
  pop ebx
  pop esi
  pop edi
end;


I tested it with:

procedure TForm1.Button1Click(Sender: TObject);
var Block1, Block2, Block3: Pointer;
    Size: Integer;
    t0: DWord;
begin
  try
     // Must be multiple of 4-bytes:    
     Size:=16*1024*1024; //16Mb
     GetMem(Block1, Size);
     GetMem(Block2, Size);
     GetMem(Block3, Size);
     FillMemory(Block1, Size, 2);
     FillMemory(Block2, Size, 3);
     t0:=GetTickCount;
       MemBlockXOR(Block1, Block2, Block3, Size);
     Button1.Caption:=IntToStr(GetTickCount-t0)+' ms';
  finally
     FreeMem(Block1);
     FreeMem(Block2);
     FreeMem(Block3);
  end;
end;

On my Athlon XP 1.4Ghz it XORed those 16Mb in 0.13 sec.

0
 
LVL 7

Expert Comment

by:Cynna
ID: 7083340
OOPS,
Sorry for double post.

robert_marquardt, yes it is.
0
 

Author Comment

by:navy_seal
ID: 7084020
Thanks guys,ill try it out, which solution is faster will get the points :-)
0
 

Author Comment

by:navy_seal
ID: 7084913
sorry Cynna ,but I found the same code that you gave me 2 days a go, so I would give points only If you could give code that is faster

here is where I found it:

http://groups.google.com/groups?hl=en&lr=&frame=right&th=a0343ed619e02a7a&seekm=7nbvmi%24qtf1%40forums.borland.com#s

they are a bit different
0
 
LVL 7

Expert Comment

by:Cynna
ID: 7086284
navy_seal,

Yes, its quite possible I saved it from Google some time ago. Anyway, as far as I can see, this code couldn't be turned up much faster, so you can count me out of the race...
0
 

Expert Comment

by:CleanupPing
ID: 9343194
navy_seal:
This old question needs to be finalized -- accept an answer, split points, or get a refund.  For information on your options, please click here-> http:/help/closing.jsp#1 
EXPERTS:
Post your closing recommendations!  No comment means you don't care.
0
 
LVL 5

Expert Comment

by:Lukasz Lach
ID: 9453405
navy_seal,
No comment has been added lately (17 days), so it's time to clean up this TA.
I will leave a recommendation in the Cleanup topic area for this question:

RECOMMENDATION: split points between robert_marquardt http:#7083333 and Cynna http:#7083336

Please leave any comments here within 7 days.

-- Please DO NOT accept this comment as an answer ! --

Thanks,

anAKiN
EE Cleanup Volunteer
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
Add bar graphs to Access queries using Unicode block characters. Graphs appear on every record in the color you want. Give life to numbers. Hopes this gives you ideas on visualizing your data in new ways ~ Create a calculated field in a query: …
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…
Suggested Courses
Course of the Month5 days, 21 hours left to enroll

627 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question