الشبكة العربية لمطوري الألعاب

خبير مدير وسام البهنسي مشاركة 1

السلام عليكم،
 
فلنناقش سوية المشاركات التي تفضل بها الأعضاء في مسابقة أنظمة العد في الحاسوب:
 
http://www.agdn-online.com/communities.aspx?view=posts&threadid=687
 
 
الجميع مدعوون لاختيار وتحديد أي المشاركات هي الأفضل (مع ذكر السبب إن أمكن). إن كان كود أحد المشاركات غير مفهوم فلنطلب من صاحب المشاركة الشرح والإفادة.

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

موهوب  ياسر أبوبكر مشاركة 2

السلام عليكم

كان عندي فضول كبير أعرف كيف كتب باقي المشاركين كودهم ... وبدأت بكود أخي وسام

إنصدمت في البداية بالمنظر :

        itoah(0xFF,txt);
	itoah(0x123,txt);
	itoah(0x3A05,txt);
	itoah(0xBBCCDDAA,txt);
	itoah(0xBAADABD0,txt);
	itoah(0x00413,txt);
	itoah(0x0,txt);

لأكتشف فيما بعد أن هذه هي أمثلة :)

المهم ... الشيء الذي حيرني هو الرقم السحري 268435456 لماذا تمت القسمة على هذا الرقم بالذات؟

ؤلاحظت وجود عمليات الضرب والقسمة والتي برأيي تزيد من زمن حساب الناتج...

محترف  انس مشاركة 3

السلام عليكم.

اريد مناقشة كود الاستاذ وسام و بالتحديد :



int hexDigitsCount = val ? 8 : 1;
ما فائدته بالتحديد ( لا اتكلم على المعامل ?  بل عن الدور الذي يؤديه في بقية الكود).

الكود الثاني :


	while (val && !(val & 0xF0000000))
	{
		val *= 16;
		hexDigitsCount--;
	}
لم افهم دوره على الاطلاق.



وفي 19 سبتمبر 2009 03:38 م، قال ياسر أبوبكر متحمساً:

المهم ... الشيء الذي حيرني هو الرقم السحري 268435456 لماذا تمت القسمة على هذا الرقم بالذات؟
نفس السؤال بالنسبة لي.

في انتظار قراءة المشاركات الاخرى عيدكم مبارك.

سلام

محترف مشرف عبد اللطيف حاجي علي مشاركة 4

أما في 20 أيلول 2009 01:22 ص، فقد تنهد انس بارتياح وهو يرد:

int hexDigitsCount = val ? 8 : 1;
ما فائدته بالتحديد ( لا اتكلم على المعامل ?  بل عن الدور الذي يؤديه في بقية الكود).
الفائدة من هذا السطر والحلقة التي تليه هو تحديد عدد محارف التمثيل الست العشري للرقم. وهو يبداً بذلك بفرضها 8 (أو رقماً واحد في حال كان الرقم صفراً)



في 20 أيلول 2009 01:22 ص، غمغم انس باستغراب قائلاً:

	while (val && !(val & 0xF0000000))
	{
		val *= 16;
		hexDigitsCount--;
	}
لم افهم دوره على الاطلاق.
في حال كان العدد صفراً لا تدخل على الإطلاق وبالتالي عدد المحارف يبقى واحداً
في حال لم يكن وكان آخر محرف للترميز العشري (المحرف في أقصى اليسار) صفراً فهذا يعني أننا يمكننا إنقاص عدد المحارف واحداً باعتبار الصفر مفروضاً دوماً إلى يسار أي عدد. وبالتالي يقوم بإنقاص عدد المحارف. كما يقوم بترقية العدد أربع منازل (بالثنائي). كمثال: تخيل لو كان العدد هو 0x0000003F نفترض عدد المحارف ثمانية. ثم نجد أن المحرف في أقصى اليسار صفراً وبالتالي ننقص عدد المنازل إلى 7 ونرقي العدد إلى 0x000003F0 وهكذا حتى يصبح عدد المنازل 2 و يصبح العدد 0x3F000000 فتنكسر الحلقة.



بتاريخ 19 أيلول 2009 05:38 م، قطب ياسر أبوبكر حاجبيه بشدة وهو يقول:

المهم ... الشيء الذي حيرني هو الرقم السحري 268435456 لماذا تمت القسمة على هذا الرقم بالذات
هذا العدد هو 0x10000000 بالنظام الست عشري وبالتالي فهذه العملية مكافئة إلى إزاحة نحو اليمين بمقدار 28 بت.



وفي 19 أيلول 2009 05:38 م، أعرب ياسر أبوبكر عن رأيه بالموقف كالآتي:

ؤلاحظت وجود عمليات الضرب والقسمة والتي برأيي تزيد من زمن حساب الناتج...
نعم ولا. مع أن كلامك صحيح إلا أنني سأستغرب من مترجم لا يستبدل العمليات السابقة بعمليات إزاحة سريعة. طبعاً عمليات الإزاحة هي الأفضل والأكثر منطقية في هذه الحالة.

ملاحظة: يبدو أن معظم المشاركات (عدا مشاركتي ومشاركة وسام على حسب ما أرى) قد وقعت في خطأ الصفر. حيث تحويل هذا العدد لا يعيد أي نص في معظم المشاركات.

عبد اللطيف حاجي علي
مبرمج
In|Framez

محترف  انس مشاركة 5

نبدء بـ : عيد مبارك للجميع.



في 20 سبتمبر 2009 08:30 ص، غمغم عبد اللطيف حاجي علي باستغراب قائلاً:

الفائدة من هذا السطر والحلقة التي تليه هو تحديد عدد محارف التمثيل الست العشري للرقم. وهو يبداً بذلك بفرضها 8 (أو رقماً واحد في حال كان الرقم صفراً)

اذا فهمت قصدك، برنامج الاستاذ وسام لايظهر سوى سلسلة من 8 حروف ؟



بتاريخ 20 سبتمبر 2009 08:30 ص، قطب عبد اللطيف حاجي علي حاجبيه بشدة وهو يقول:

كما يقوم بترقية العدد أربع منازل (بالثنائي)
لم استوعب جيدا هذه النقطة، من فضلك هلا شرحتها لي بمثال ؟ ( لم افهم سبب الترقية بالعدد  4^2 ).



وفي 20 سبتمبر 2009 08:30 ص، أعرب عبد اللطيف حاجي علي عن رأيه بالموقف كالآتي:

هذا العدد هو 0x10000000 بالنظام الست عشري وبالتالي فهذه العملية مكافئة إلى إزاحة نحو اليمين بمقدار 28 بت.
و ما الفائدة من هذه العملية ؟



في 20 سبتمبر 2009 08:30 ص، قال عبد اللطيف حاجي علي بهدوء وتؤدة:

ملاحظة: يبدو أن معظم المشاركات (عدا مشاركتي ومشاركة وسام على حسب ما أرى) قد وقعت في خطأ الصفر. حيث تحويل هذا العدد لا يعيد أي نص في معظم المشاركات.




اظن ان مشاركتي ترسل نصا، ام انني لم افهم قصدك ☺ .
سلام

محترف مشرف عبد اللطيف حاجي علي مشاركة 6

بتاريخ 20 أيلول 2009 01:19 م، قطب انس حاجبيه بشدة وهو يقول:

اذا فهمت قصدك، برنامج الاستاذ وسام لايظهر سوى سلسلة من 8 حروف ؟
يظهر سلسلة أقصاها ثمانية حروف (أكبر عدد ممكن تمثيله في متغير من نوع int). الفكرة هي ألًا تمثل العدد 543 بـ 0x0000021F بل تمثله بـ 0x21F



وفي 20 أيلول 2009 01:19 م، أعرب انس عن رأيه بالموقف كالآتي:

هذا العدد هو 0x10000000 بالنظام الست عشري وبالتالي فهذه العملية مكافئة إلى إزاحة نحو اليمين بمقدار 28 بت.و ما الفائدة من هذه العملية ؟
دعني أسألك. إذا أردت الحصول على العدد 9 من العدد 0x9A52234F فما الذي تفعله؟



في 20 أيلول 2009 01:19 م، قال انس بهدوء وتؤدة:

لم استوعب جيدا هذه النقطة، من فضلك هلا شرحتها لي بمثال ؟ ( لم افهم سبب الترقية بالعدد  4^2 ).
كتكملة للسؤال السابق. ماذا لو أردت الحصول على بقية الأعداد من 0x9A52234F؟ أي نريد الحصول على العدد 9 ثم A (10) ثم 5 ثم 2 وهكذا...



في 20 أيلول 2009 01:19 م، عقد انس حاجبيه بتفكير وقال:

اظن ان مشاركتي ترسل نصا، ام انني لم افهم قصدك
ممم.. لسببٍ ما لم أقم بقراءة مشاركتك في المرة السابقة. لقد قمت للتو وهي بالفعل تقوم بإعاد النص "0" عن أخذ الصفر.
لي عدة ملاحظات عليها، سأخبرك بها حالما ننتهي من نقاش مشاركة وسام.

ما رأيكم بترتيب النقاش؟ (بحسب تاريخ المشاركة، تقريباً)
سنكمل أولا مناقشة مشاركة وسام
ثم مشاركة أنس
ثم مشاركة محمد يامن سرايجي
ثم مشاركتي
ثم مشاركة مؤيد مارديني
وأخيراً مشاركة ياسر أبو بكر

لأنني أعتقد أن الأمر سيصبح خليطاً من المعكرونة والسلطة إن قمنا بخلط النقاش.

يمكن أيضاً أن يضع كل من يريد المشاركة رأيه بالمشاركة، تقييمه، انتقاداته و أسئلته. ليجيب عنها آخر في مشاركته

عبد اللطيف حاجي علي
مبرمج
In|Framez

محترف  انس مشاركة 7

وفي 20 سبتمبر 2009 12:44 م، أعرب عبد اللطيف حاجي علي عن رأيه بالموقف كالآتي:

دعني أسألك. إذا أردت الحصول على العدد 9 من العدد 0x9A52234F فما الذي تفعله؟
اظن انني ساستعمل المعامل : <<
كيف او كم عدد الازاحاة ليست لدي اي فكرة، خبرتي في النظام الست عشري ضئيلة جدا.
( بعد التجربة لاحظت انه للازاحة نحو اليمين يجب استعمال مضاعفاة العدد 4 )



في 20 سبتمبر 2009 12:44 م، قال عبد اللطيف حاجي علي بهدوء وتؤدة:

كتكملة للسؤال السابق. ماذا لو أردت الحصول على بقية الأعداد من 0x9A52234F؟ أي نريد الحصول على العدد 9 ثم A (10) ثم 5 ثم 2 وهكذا...
بعد التجربة وجدت انه يجب استعمال العبارة التالية :
( ( 0x9A52234F >>  (4xp)  ) ) << 28 )
و ما زلت لا اعلم سبب استعمال العدد 28 🙁 .



في 20 سبتمبر 2009 12:44 م، عقد عبد اللطيف حاجي علي حاجبيه بتفكير وقال:

لي عدة ملاحظات عليها
لاحظت بعض الاخطاء التي وقعت فيها، لكن للاسف لاحظتها مأخرا ☺ . انا في انتظار ملاحظاتك استاذ عبد اللطيف.

محترف مشرف عبد اللطيف حاجي علي مشاركة 8

بما أن 16 من قوى العدد الاثنين (16=2^4) فكل رمز ست عشري يقابل 4 بتات. وبالتالي للحصول على الرمز الثامن نحتاج إلى إزاحة نحو اليمين بمقدار 7 منازل ست عشرية أي ما يعادل 7*4 = 28 بت


0x9A52234F >>  4 = 0x09A52234
0x09A52234 >>  4 = 0x009A5223
.
.
.
0x9A52234F >> 28 = 0x00000009

الآن لو أردنا الحصول على الرموز واحداً تلو الآخر:


// الرمز الأول
0x9A52234F >> 28 = 0x00000009

// الرمز الثاني
0x9A52234F << 4 = 0xA52234F0
0xA52234F0 >> 28 = 0x000000A


// الرمز الثالث
0xA52234F0 << 4 = 0x52234F00
0x52234F00 >> 28 = 0x0000005
وهكذا. لاحظ أن الإزاحة نحو اليسار 4 منازل يكافئ الضرب بـ 16 ونحو اليمين 28 منزلة يكافئ القسمة على 268435456 أو 0x10000000

أجد من الضروري أن أذكرك بأن المقالة التي قمت بكتابتها على الشبكة مؤخراً تحوي الخلفية الرياضية لهذه العمليات وغيرها.

حتى يتعمق ويتأكد فهمك للموضوع حاول الإجابة على السؤال التالي: ماذا لو أردنا الحصول على الرمز الخامس للتمثيل الست عشري من العدد؟ ماذا عن الرمز السادس للتمثيل الثماني للعدد؟

ملاحظة: عندما أقول رمز ما أعنيه حقاً هو قيمة الرمز أي 10 لـ 'A' و 1 لـ '1' و 15 لـ 'F'

عبد اللطيف حاجي علي
مبرمج
In|Framez

خبير مدير وسام البهنسي مشاركة 9

أنتم تعقدون المسألة على أنفسكم بالتفكير بالموضوع من منظور النظام الثنائي كوسيط للحسابات. الكود الخاص بي يحل المسألة من خلال النظام الست عشري فقط مع تجاهل النظام الثنائي قدر الإمكان.
 
المتغير من نوع int يستطيع التعبير عن 8 خانات ست-عشرية. لذلك تجد أن حلقة المعالجة تضع حداً أقصى 8 دورات.
 
عندما تضرب بالرقم 16 فكأنك تزيح كافة الخانات الست-عشرية يساراً بمقدار خانة واحدة.
وبالعكس، عندما تقسم على الرقم 16 فكأنك تزيح كافة الخانات الست-عشرية يميناً بمقدار خانة واحدة.
 
الرقم 268435456 هو 16 مرفوعة للقوة 7. عندما تقسم على هذا الرقم فكأنك تجلب الخانة الست-عشرية الثامنة في الرقم وتجعلها الخانة الأولى (إزاحة لليمين 7 خانات).
 
الآن انظروا إلى الكود مرة أخرى بعد التعرف على العمليات المذكورة أعلاه وستجدون أن الكود منطقي للغاية ☺

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

محترف  انس مشاركة 10

شكرا لكما استاذ وسام و استاذ عبد اللطيف. الكود اتضح اكثر. بقي سؤال الاستاذ عبد الطيف ساحاول فهمه و الاجابة عليه في موضوع منفصل.