Avatar billede krismort Nybegynder
11. august 2006 - 17:40 Der er 6 kommentarer

0xAABBCCDD til 0xAABB og 0xCCDD

Hej,
Jeg lurede på om der er nogen som kan sige noget om hvordan jeg på den hurtigste måde kan konveterer tallet 0xAABBCCDD til tallene 0xAABB og 0xCCDD i c/c++ eller feks ASM ?
Avatar billede arne_v Ekspert
11. august 2006 - 18:42 #1
shift & mask

v = 0xAABBCCDD;
high = (v >> 16) & 0xFFFF;
low = v & 0xFFFF;

vil man normalt antage er hurtigt
Avatar billede bertelbrander Novice
11. august 2006 - 20:43 #2
Man kan også kaste sig ud i:

  unsigned short high = *((unsigned short *)&n + 1);

Det forudsætter at maskinen kører little endian, som f.ex en PC.
Avatar billede arne_v Ekspert
12. august 2006 - 01:10 #3
det er uden tvivl hurtigere
Avatar billede bertelbrander Novice
12. august 2006 - 01:20 #4
Borland giver dette assembler output:
  ;      unsigned int n = 0xAABBCCDD;
  ;   
@1:
    mov      dword ptr [ebp-4],-1430532899
  ;   
  ;      unsigned short high1 = *((unsigned short *)&n + 1);
  ;   
    mov      bx,word ptr [ebp-2]
  ;   
  ;      unsigned short high2 = n >> 16;
  ;   
?live16385@48: ; EBX = high1
    mov      esi,dword ptr [ebp-4]
    shr      esi,16
  ;   
  ;      unsigned short high3 = (n >> 16) & 0xFFFF ;
  ;   
?live16385@64: ; EBX = high1, ESI = high2
    mov      edi,dword ptr [ebp-4]
    shr      edi,16
    and      di,-1


Den første metode klares på 1 instruktion.
Den anden koster 2 instruktioner
Jeg forstår ikke hvorfor der er forskel på de to sidste. Operationen "and di, -1" er så vidt jeg kan se en NOP
Avatar billede arne_v Ekspert
12. august 2006 - 02:26 #5
du er smartere end optimizeren

:-)
Avatar billede krismort Nybegynder
12. august 2006 - 19:09 #6
tak til jer begge 2 :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester