jak pobrać bajt ze zmiennej integer?

0

No właśnie jestem początkujący i niewiem
Ze stringa można by tak znak:= string[1] [???]

0

Hmm podzielić przez ileśtam (a dla dalszych bajtów trzeba shr o 8, 16 i 24 i potem dzielić). Tak myślę że by było ok ;]

[Dopisane]
O nawet dzielić nie trzeba :P napisałem Ci zgrabną funkcyjkę

function GetByteFromInteger(I: Integer; ByteNumber: Byte): Byte;
begin
 Result := I shr (ByteNumber * 8);
end;

Bajty są numerowane od 0 do 3 (Integer ma ich 4 w SPACJA końcu). Dla

 I:=1000000;
 Memo1.Lines.Add(IntToStr(GetByteFromInteger(I,0)));
 Memo1.Lines.Add(IntToStr(GetByteFromInteger(I,1)));
 Memo1.Lines.Add(IntToStr(GetByteFromInteger(I,2)));
 Memo1.Lines.Add(IntToStr(GetByteFromInteger(I,3)));

wychodzi

64
66
15
0

Powinno być ok :) Ale jestem dumny z siebie za tą funkcję :), tak w ogóle to mam super humorek :P

[Dopisane do tych poniżej :P]
A moja jest najbardziej łopatologiczna :P

0
function ByteFromInt(i,byteno:Integer):byte; //byteno 0..3, no checking
var
 b:^byte;
begin
  b:=@i;
  inc(b,byteno);
  Result:=b^;
end;
0
function getbyte(nr:integer;var buf):byte; // moze byc: (nr,buf:integer) -obojetne
type pb=^byte;
begin 
  getbyte:=pbyte(dword(dword(@buf)+nr))^
end;

// albo

function getbyte(nr,buf:integer):byte;
var b:array[0..3]of byte absolute buf;
begin 
  getbyte:=b[nr]
end;

// lub też

{$r-}
function getbyte(nr:integer;var buf):byte
type bbuf=array[0..0]of byte;
begin
  getbyte:=bbuf((@buf)^)[nr]
end;

I założę się, że każdy kto odpowie będzie to robił troche inaczej :]

0

Pierwsze miejsce:

Sheitar - wykonanie 10 mln razy ok. 43 ms, niezależnie od numeru bajtu

Drugie miejsce:

Flabra - kod 3 ten sam czas, kody 1 i 2 gwałcą dostęp

Trzecie miejsce:

lama pq - ok. 46 ms dla numeru bajtu=0 i ok. 113ms dla 1-3

// to co, robimy konkurs na najszybszy dostęp do pojedynczego baju? :d [mf]

0

[hurra] pierwszy raz jestem pierwszy. Tylko ciekawi mnie czemu nikt z ASM nie wyskoczył [???] Wtedy mój kod pewnie by poległ.

0

oki oki...

function getbyte(nr,buf:integer):byte;
assembler;
asm
  mov ebx,[nr]
  mov al,byte ptr buf[ebx]; // byte ptr [buf+ebx]
end;

// co do gwałtu na dostępie (access violation)... pPM pier****** protected mode ;p
// berl jedno drugiego nie wyklucza

0

Tylko ciekawei mnie czemu nikt z ASM nie wyskoczył

Bo to dział Delphi/Pascal.

1 użytkowników online, w tym zalogowanych: 0, gości: 1