المشاركات : 632
المواضيع 66
:
: 6
الإنتساب : Jul 2010
B.M.AbdelAziZ كتب :لم انتبه للشرط الاول بسبب السرعة...هذا حل أخر بوقت اقل من السابق!
[COLOR="Red"]حل صحيح (منطقي) و مقبول أخي B.M.AbdelAziZ ..
[/COLOR]
تحليل على السريع : (حتى يفهم من يريد المشاركة معنا )
القيمة التي تعيدها RGB هي COLORREF (حجم 4 بايت ) .. لكن R+G+B لا يتعدى 3 بايت => البايت الرابع = 00
كود : 0B0000
+ 0G00
+ 0R
---------------------
= RGB(R,G,B)
كون البايت في نظام الهكس مكون من رقمين :
كود : result:=b*$10000 {Alloc 3 bytes}
+g*$100 {Alloc 2 bytes}
+r; {One byte }
المشاركات : 632
المواضيع 66
:
: 6
الإنتساب : Jul 2010
virtual كتب :عفوا لم انتبه . جو العمل المتعب لم يترك لي مجال للتفكير
a or b = a + b صحيح لكن على مستوى البت الواحد 1 و 0
يبدو ان اجابة الاستاذ B.M.AbdelAziZ هي الصحيحة
نعم على مستوى البت الواحد
بالفعل اجابة الاستاذ B.M.AbdelAziZ صحيحة 100% ..
في انتظار اجابتك ...
المشاركات : 306
المواضيع 45
:
: 0
الإنتساب : Jul 2012
PHP كود : function MakeRGB(R,G,B : Byte):Cardinal ; begin Result := R * $10000; asm MOV EAX,0 MOV EAX,Result MOV AH,G MOV AL,B MOV Result,EAX end; end;
function GetRValue_T(RGB : Cardinal):Byte ; begin Result := RGB div $10000; end;
function GetGValue_T(RGB : Cardinal):Byte ; begin asm MOV EAX,RGB MOV Result,AH end; end;
function GetBValue_T(RGB : Cardinal):Byte ; begin asm MOV EAX,RGB MOV Result,AL end; end;
السلام عليكم
هذا حلي ... , انتظر التعليقات على الكود ( سرعة .. كفائة ... إلخ ) << إذا امكن
وشكرا لك اخي المبرمج SMP3 على التمرين وتنشيط المخ/العقل
المشاركات : 632
المواضيع 66
:
: 6
الإنتساب : Jul 2010
ALmuhhnad كتب :السلام عليكم
هذا حلي ... , انتظر التعليقات على الكود ( سرعة .. كفائة ... إلخ ) << إذا امكن
وشكرا لك اخي المبرمج SMP3 على التمرين وتنشيط المخ/العقل
[COLOR="Indigo"]شكرا على المشاركة اخي ALmuhhnad
بالنسية للدالة MakeRGB التي كتبتها فهي خاطئة مع الأسف
جرب :
كود : a:= MakeRgb($10,$34,$50);
b:= Rgb($10,$34,$50);
نفس الأمر ينطبق على الدالة GetBValue_T و الدالة GetٌRValue_T
[/COLOR]
حاول مرة أخرى ..
المشاركات : 632
المواضيع 66
:
: 6
الإنتساب : Jul 2010
تذكر أخي المبرمج أن أعقد الأمور لا تتطلب أعقد الحلول لحلها !!
لتسهيل التحدي : يمكن استخدام عدة طرق للقيام بحل التمرين (لقد قمت بحل التمرين باستخدام ثلاث طرق مختلفة)
-استخدام المؤشرات
-استخدام الأسمبلي
- استخدام تعليمات لغة باسكال : + , - , * , div ...
- استخدام ؟؟؟؟؟؟؟؟ (لن أذكره حتى لا أحرق الفكرة )
المشاركات : 306
المواضيع 45
:
: 0
الإنتساب : Jul 2012
PHP كود : function MakeRGB(R,G,B : Byte):Cardinal ; begin Result := B * $10000; asm MOV EAX,0 MOV EAX,Result MOV AH,G MOV AL,R MOV Result,EAX end; end;
تصحيح .. إذا كان الامر بالاماكن فقط @@"
المشاركات : 306
المواضيع 45
:
: 0
الإنتساب : Jul 2012
هذه طريقة آخرى للدالة RGB
PHP كود : function MakeRGB(R,G,B : Byte):Cardinal ; begin Result := (B*$10000)+(G*$100)+(R) end;
لم الحظ ان اخي المبرمج [ B.M.AbdelAziZ ] كتبها قبلي ... في الحقيقة كتبت الحل قبل ان انظر بالحلوول الأخرى
المشاركات : 632
المواضيع 66
:
: 6
الإنتساب : Jul 2010
ALmuhhnad كتب :هذه طريقة آخرى للدالة RGB
PHP كود : function MakeRGB(R,G,B : Byte):Cardinal ; begin Result := (B*$10000)+(G*$100)+(R) end;
[URL="http://www.delphi4arab.net/forum/showpost.php?p=41390&postcount=9"]سبقك اليها الأخ B.M.AbdelAziZ
[/URL]
المشاركات : 306
المواضيع 45
:
: 0
الإنتساب : Jul 2012
إقتباس :لم الحظ ان اخي المبرمج [ B.M.AbdelAziZ ] كتبها قبلي ... في الحقيقة كتبت الحل قبل ان انظر بالحلوول الأخرى
هههههه ... هذه نفس الطريقة لكن بالأسمبلي :
PHP كود : function MakeRGB(R,G,B : Byte):Cardinal ; begin asm MOV EAX,0 MOV AL,B MOV ECX,$10000 MUL EAX,ECX MOV AL,G MOV CX,$100 MUL AX,CX MOV AL,R MOV Result,EAX end; end;
المشاركات : 632
المواضيع 66
:
: 6
الإنتساب : Jul 2010
ALmuhhnad كتب :PHP كود : function MakeRGB(R,G,B : Byte):Cardinal ; begin Result := B * $10000; asm MOV EAX,0 MOV EAX,Result MOV AH,G MOV AL,R MOV Result,EAX end; end;
تصحيح .. إذا كان الامر بالاماكن فقط @@"
[COLOR="Navy"]آه لم أنتبه لهذا الرد ..
حل صحيح و مقبول لكن لن ماذا عن الدالة GetBValue_T و الدالة GetٌRValue_T !!!
--------------------------------
تعديل بسيط على الدالة :
هكذا أفضل :[/COLOR]
PHP كود : function MakeRGB(R,G,B : Byte):Cardinal ; asm MOV CH,AL XOR EAX,EAX MOV AL,CL IMUL EAX,$10000 MOV AH,DL MOV AL,CH end;
|