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
c ve delphide integer kullanımı
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: c ve delphide integer kullanımı
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:
Aşağıdaki örnek ise ağırlıklı olarak maskeleme üzerinden çalışarak aynı hesaplamayı yapmaktadır:
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:
Örnekler saf Pascal kodu ile verilmiştir. Bununla beraber zaman kritik işlemler yapılacak ise ASM bloğu kullanılabilir.
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;
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;
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;
-
- Üye
- Mesajlar: 24
- Kayıt: 31 Oca 2015 03:24
Re: c ve delphide integer kullanımı
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..
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..