c ve delphide integer kullanımı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ekremkocak
Üye
Mesajlar: 24
Kayıt: 31 Oca 2015 03:24

c ve delphide integer kullanımı

Mesaj gönderen ekremkocak »

Arkadaşlar c deki bu codu

int BITS[2] = { 8, 16 };

int signconv(int w, int x) {
return x << 32 - BITS[w] >> 32 - BITS[w];
}

delphiye cevire bilirmisiniz...


const
BITS:array[0..2-1] of Integer =(8,16);

function signconv( w:integer; x: integer): Integer;
begin
result:= x shl 32 - BITS[w] shr 32 - BITS[w];
end;


sonuc tutmuyor... c de signconv(0,65529) = -7 delphide signconv(0,65529)=65513
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: c ve delphide integer kullanımı

Mesaj gönderen ertank »

Merhaba,

CPU değerleri ötelemek (shift) için iki yol bilir. Mantıksal Öteleme ve Matematiksel Öteleme. C Matematiksel Öteleme kullanırken Delphi Mantıksal Öteleme kullanır. Bu yüzden benzer kodlar farklı sonuçlar vermektedir.

Fonksiyonu kod benzerliği ile Delphi içinde yazmak istersek aşağıdaki gibi bir kod yazılabilir:

Kod: Tümünü seç

function SignConv(const W, X: Integer): Integer;
const
  BITS: array [0..1] of Integer = (8, 16);
var
  Shift: Integer;
  N: Integer;
  MSB: Boolean;
begin
  Shift := 32 - BITS[W];
  N := X shl Shift;
  MSB := N < 0;
  Result := N shr Shift;
  if (MSB) then
  begin
    Result := ($FFFFFFFF shl BITS[W]) or Cardinal(Result);
  end;
end;
Aşağıdaki örnek ise ağırlıklı olarak maskeleme üzerinden çalışarak aynı hesaplamayı yapmaktadır:

Kod: Tümünü seç

function SignConvAlt(const W, X: Integer): Integer;
const
  Masks: array [0..1] of Integer = ($FF, $FFFF);
  Flags: array [0..1] of Integer = ($80, $8000);

  function GetFiller(const X, Mask, Flag: Integer): Integer; inline;
  begin
    if ((X and Flag) = 0) then
    begin
      Result := 0;
    end
    else
    begin
      Result := $FFFFFFFF and (not Mask);
    end;
  end;

  function Convert(const X, Mask, Flag: Integer): Integer; inline;
  begin
    Result := GetFiller(X, Mask, Flag) or (X and Mask);
  end;

begin
  Result := Convert(X, Masks[W], Flags[W]);
end;
SignConvAlt() fonksiyonu SignConv() fonksiyonuna göre daha hızlı çalışan bir koddur. Detayını incelemedim ancak tahminime göre hesaplama adımları değişkenler içinde saklandığı için daha hızlı çalışıyor olabilir.

Son olarak aynı sonucu verecek alternatif kod:

Kod: Tümünü seç

function SignConvFast(const W, X: Integer): Integer;
begin
  if (W = 0) then
    Result := Integer(Int8(X))
  else
    Result := Integer(Int16(X));
end;
Örnekler saf Pascal kodu ile verilmiştir. Bununla beraber zaman kritik işlemler yapılacak ise ASM bloğu kullanılabilir.
ekremkocak
Üye
Mesajlar: 24
Kayıt: 31 Oca 2015 03:24

Re: c ve delphide integer kullanımı

Mesaj gönderen ekremkocak »

Tesekkürler...
Simdilik sorunu

function signconv(Size:Integer; Value:Longint):Longint;
begin
case Size of
0: Result:= ShortInt(Value shl 24 shr 24);
1: Result:= SmallInt(Value shl 16 shr 16);
end;
end;

bununla cözdüm..
Cevapla