No właśnie jestem początkujący i niewiem
Ze stringa można by tak znak:= string[1] [???]
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
function ByteFromInt(i,byteno:Integer):byte; //byteno 0..3, no checking
var
b:^byte;
begin
b:=@i;
inc(b,byteno);
Result:=b^;
end;
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 :]
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]
[hurra] pierwszy raz jestem pierwszy. Tylko ciekawi mnie czemu nikt z ASM nie wyskoczył [???] Wtedy mój kod pewnie by poległ.
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
Tylko ciekawei mnie czemu nikt z ASM nie wyskoczył
Bo to dział Delphi/Pascal.