الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال حول بعض المعاملات

مغلق
بدأه fafe0 في 1 أبريل 2006 · 12 رد · 2,083 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

طبعاً قبل وضع السؤال بحثت في المنتدى ولم أجد أي نتيجة

وقرأت كتاب أساسي باسكال، ولم أجد شرح لهذا المعامل.

سؤالي هو:

ما هو وكيف استخدم وما فائدة xor ؟

طبعاً بعد البحث في قوقل، وجدت موضوع في موقع delphi basics يتكلم عن هذا المعامل، وذاكرين أنه له استعمالان مع المعاملات البولية والمعاملات الحسابية

بالنسبة للمعاملات البولية ما عندي اي مشكلة، يعني هي سهلة:

if true xor false then showmessage('somting');

في هذه الحالة سيتم إظهار الرسالة، لأن هذا المعامل يرجع القيمة true إذا اختلفت التعابير البولية.

لكن كيف استخدمه مع المعاملات الرياضية ؟؟؟؟؟

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

سؤال ثاني: ما هو shl ؟

وشكراً لكم

السلام عليكم ورحمة الله وبركاته.

تم تعديل هذه المشاركة بواسطة fafe0 في 1 أبريل 2006 في 13:05

#2

Xor = Exclusive or

ماهو:

علاقة منطقية

مثل Or لكن تكون القضية صحيحة في حالة كانت إحدى القضيتين فقط صحيحة

في ما ذا تستخدم ؟

في أشياء كثيرة... أنت تدرس Assembly و ستلاحظ أنها مفيدة كثيرا...

shl = Shift Left

تقوم بعمل إزاحة لبتتات عددما بمقدار معين

مثال على إستخدامها

مشاركة الأخ مراد

d4baa0.gif
#3

بالنسبة ل XOR هي ببساطة تعتمد على القاعدة التي ذكرت و تطبق على الارقام طبعا على المستوى النظام الثنانئ

 Binary value  : 0010 0101   
 Binary value  : 0011 0010   
 XOr'ed value : 0001 0111

اي 1 مع 1 يعطي صفر و نفس النتيجة بالنسبة ل 0 مع 0

اما 1 مع 0 فيعطي دائما واحد

هذا على النظام الثنائي طبعا

بالمناسبة احدى استخدامات XOR هو تشفير كلمات السر :)

اما shl او ما يطلق عليه Shift Left

وهي تعمل على تدوير البتات الي جهة اليسار:

مثال:

003C = 0000 0000 0011 1100
Shl 4
03C0 = 0000 0011 1100 0000
Shl 4
3C00 = 0011 1100 0000 0000
Shl 4
C000 = 1100 0000 0000 0000

تحياتي

#4

السلام عليكم

بارك الله فيكم على الإجابة، الشرح مفهوم.

بس ممكن مثال لطريقة استخدام xor مع الأرقام ؟؟

ومثال صغير جداً في تشفير كلمات السر بهذا المعامل ؟؟

مثال بسيط جداً من فضلكم، ومشكورين مقدماً..

تم تعديل هذه المشاركة بواسطة fafe0 في 1 أبريل 2006 في 14:15

#5

هذا مثال لتشفير كلمة السر من موقع http://www.swissdelphicenter.ch

procedure TForm1.Button1Click(Sender: TObject);
var
  s: String[255];
  c: array[0..255] of Byte absolute s;
  i: Integer;
begin
  {encode}

  s := 'SwissDelphiCenter.ch';
  for i := 1 to Ord(s[0]) do c := 23 xor c;
  Label1.Caption := s;

  {Decode}

  s := Label1.Caption;
  for i := 1 to Length(s) do s := Char(23 xor Ord(c));
  Label2.Caption := s;
end;
#7

شكراً جزيلاً على الشرح وعلى الأمثلة

بالنسبة للأخ DeltaAziz أنا أصلاً لا أعرف ما هي << ولا >> ، بس على العموم شكراً على التوضيح :)

بس سؤال آخر صغير:

ما الفرق بين 25 و 25$ هذا كان موجود في المثال تبع delphi basics

كاتبين أنه binary number، بس ما هو الbinary أصلاً ؟؟؟

أريد شرح صغير وبسيط حول هذا الأمر أيضاً :)

وآسف على الإزعاج بكثرة الأسئلة :|

شكراً لكم

تم تعديل هذه المشاركة بواسطة fafe0 في 1 أبريل 2006 في 15:30

#8
fafe0 كتب:
أنا أصلاً لا أعرف ما هي <<  ولا >> ، بس على العموم شكراً على التوضيح :)

القصد أن في موضوع شغل مخك المثال مكتوب بلغة C

فدلفي كما في لغة Assembly نكتب SHL أما في لغة C نكتب <<

ربما تحتاجها يوما

مثال بسيط، تريد قسمة أي عدد على 2، يكفي إزاحة بتاته نحو اليمسن بواحد

fafe0 كتب:
ما الفرق بين  25 و 25$  هذا كان موجود في المثال تبع delphi basics

كاتبين أنه binary number، بس ما هو الbinary  أصلاً ؟؟؟

25 Binary أي النظام العادي المستعمل

ذو الأساس 10

25 حبة بيض مثلا

أما $25 فمكتوبة بالنظام ذو الأساس 16 أي Hex

تساوي 100101 حبة بيض :D

d4baa0.gif
#9

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

المعاملات في ديلفي متنوعة و استعمالاتها مختلفة على حسب موضوع البرمجة. من بين هذه المعاملات معاملات تسمى بمعاملات Bitwise Operators معاملات تدخل على تركيبة البراميترات في كتابتها في نظام العد البيناري Binarry system.

فهي تقوم بعملية جراحية على مستوى البتات Bits. فما هو البت BIT وما نقصد بنظام العد الثنائي؟

النظام العددي المعمول بعه عادة هو نظام العد العشري Decimal System وسمي ب العشري لأنه يستخدم عشرة رموز لكتابة أي عدد صحيح و هي : 0 1 2 3 4 5 6 7 8 9. فكل عدد في هذا النظام لا يستخدم إلا هذه الرموز فقط..

ملا حظة أخرى في هذا النظام أن طريقة كتابة عدد يتكون من عدة رموز-أرقام, تكون على أساس أن كل رقم له رتبة يجب إحترامها: مثلا العدد 123 لا يمكن كتابة ترتيب أرقامه على شكل آخر ك 132 او 231.

هذا لأن 1 يمثل عدد المئات و2 تمثل عدد العشرات و 3 تمثل عدد الوحدات في العدد 123

أي يمكن كتابة العدد 123 على شكل قوى للعدد عشرة:

123= 3 * 10^0 + 2 * 10^2 + 1* 10^3

العدد 10 يسمى قاعدة العد the base في النظام العشري.

جيد, لنفترض أن الإنسان خلقه الله ب أصبع واحدة في كل يد عوض عشرة أصابع!! كيف سيكون نظام العد؟ :lol:

سيستعمل رمزين فقط للتعبير على كل الأعداد و سيبدأ العد هكذا:

0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111...

عوض أن يكتب في النظام العادي ( نظام العشرة أصابع):

0 1 2 3 4 5 6 7 8 9 10 11 1 2 13 14 15 ..

هذا النظام الذي يعتمد على رمزين فقط يسما ببساطة نظام العد الثنائي لأنه يستخدم رقمين هما الصفر و الواحد..

لاحظ أن هذا النظام الثنائي له قاعدة كما في النظام العشري و هي 2.

فيمكنك مثلا كتابة:

1110b = 0 * 2^0 + 1*2^1+ 1*2^2+ 1*2^3= 14d

فالعدد 1110 في النظام العد الثنائي يكتب 14 في نظام العد العشري.

الحاسب هي آلة إلكترونية تعمل بالكهرباء التي تمر في أسلاكها, فهو لا يعرف ما ذا تعني الأعداد أو السلاسل المحرفية أو الملفات ...

فهو يعتمد فقط على الكهرباء للتعامل مع البيانات. لهذا فإن أبسط طريقة له في العد هو: هل يوجد جهد كهربائي في سلك أم لا يوجد؟

إن وجد فإنه يعتبره كأنه 1 , إن كان الجهد منعدم فهو صفر.

لكن سلك واحد لا يكفي للتعامل مع الكم الهائل للبيانات , لهذا فإنه يقوم بجس عدد من الأسلاك مرتبة لكي يتعامل مع الأرقام الضخمة.

ف سلك واحد يكفي لتخزين رقمين فقط: 1 أو 0

لكن سلكين يمكن أن يكتب فيها عدد ك : 00, 01, 10, 11

أربعة أسلاك : من 0000 إلى 1111.

و هكذا..

كل سلك يمكنه تخزين رقم من قوى العدد 2 ويسمى بالبت Bit = Binarry Digit.

فالحاسب( المعالج Processor) يحتوي على خانات من 8 Bits وتسمى ب البايت Byte. ومن خانات 16Bits و تسمى ب Word. و من خانات 32Bits و تسمى ب DoubleWord.

ارجو أن أكون قد بسطت الأمر على كل مبتدئ يسأل على نظام العد الثنائي.

هناك نظام عد آخر وهو نظام له أهمية كبيرة جدا في البرمجة المنخفظة المستوى عند التعامل مع المعالجات و هو نظام العد الستعشري Hexadecimal system. و أهميته تكمن في تبسيط كتابة الأعداد الثنائية لأنه نظام يعتمد على قاعدة العد 16 ورموزه الستة عشر هي: 0 1 2 3 4 5 6 7 8 9 a b c d e f.

لتفرقة ما بين الأعداد العشرية و الأعداد الستعشرية نظيف رمز يشير أن هذا العدد هو ست عشري.

رمز التفرقة يختلف من لغة لأخرى كإظافة حرف h أو في باسكال دلفي مثلا نستخدم $ وفي لغة البرمجة C نستخدم 0x في مقدمة كل عدد:

exemple $3af4e = 0x3af4e = 3af4eh = 13* 16^0 + 4* 16^1 + 15* 16^2 + 10* 16^3 + 3* 16^4= (241486)d

أنظر الجدول التالي:

Binary_Hex_Decimal--Table2.gif

لهذا فالعدد 25 يختلف تماما عن 25$ فالأول مكتوب في نظام العدد العشري أما الثاني فهو عدد مكتوب في نظام العد الستعشري:

in hex $25 = 5 * 16^0 + 2* 16^1 = 37 in decimal<> 25 decimal

شكرا ل DeltaAziz :D

اآن يا أخي fafe0 إذا ما فهمت هذه التعقيدات البسيطة التي تعتبر الباب الرئيسي للبرمجة في اللغات المنخفظة المستوى ك لغة التجميع Assembly language. ستستطيع حساب البيض في نظام العد العشري والثنائي أو أي نظام آخر لأي قاعدة في الأرض أصحاب 10 أصابع او في أرجاء السماوات من خلق الله أن وجدوا بأصابعهم 16 أو 32 أو 64 :lol:

تم تعديل هذه المشاركة بواسطة ikossan في 1 أبريل 2006 في 19:08

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#10

بعدما عرفنا أن المعالج يتعامل مع كل رقم على أنه مجموعة من البتات مرتبة على حسب قوى العدد 2, يمكننا أن نشرح دور المعاملات المنخفظة Bitwise Operators على مستوى البت التي تستعمل في لغات البرمجة: And, Or, Not, Xor, Shl, Shr.. :

Table1_Bitwise-operators.gif

معامل "و" AND:

يسمى أيظا بالجداء بت في بت, و يرمز لها في دلفي ب AND. يقوم بعمل جداء بت في بت من نفس الرتبة ( نفس قوى 2) للعددين صحيحين.

الإحتمالات الممكنة معطاة في الجدول أسفله,ما يسمى بجدول الحقيقة.

أول سطر في هذا الجدول هو 0and0=0

And-Table.gif

نلاحظ أن الناتج لهذا المعامل لا يكون واحد إلا إذا كان البت الأول و البت الثاني مساويان لواحد. لهذا يسمى هذا المعامل ب الجداء:

0*0=0, 0*1=0, 1*0=0 1*1=1,

مثال1 : 11011100And10010001 = 10010000

مثال2 : 11011100AND11110000 = 11010000

ما فائدة هذا المعامل في البرمجة؟ الفائدة في استعماله هي فلترة البتات التي نريدها من ضمن مجموع البتات المكونة لعدد مكتوب بنظام العد البيناري.

أنظر في المثال الثاني: قمنا بعمل فلترة للبتات الأربع الأخيرة باستعمال القناع 11110000. لأن كل and مع 0 فهي صفر لكن كل and مع 1 فهي ترجع نفس العدد:

مثال آخر: 110z1101AND 00010000= 000z0000 في هذا المثال قمنا بفلترة للبت الخامس(z) باستعمال القناع 00010000.

أستعمال ثاني: هو وضع (إرغام) بت على أخذ قيمة 0 في عدد صحيح مثال: 101100x1 and 11111101= 10110001 فقد أرغمنا البت الثاني أي يأخذ القيمة صفر دون أن نمس بقيم البتات الأخرى.

معامل "أو" OR:

يسمى كذلك بالجمع بت مع بت, تكتب في دلفي OR.

يقوم هذا المعامل بجمع بت مع البت المقابل له في نفس الرتبة ( ملاحظة الجمع هو جمع بت على بت فلا نكتب 1+1 = 10, لكن: 1+1 = 1).

جدول الحقيقة للمعامل OR:

OR-Table.gif

نلاحظ أن ناتج يكون واحد لو أن على الأقل البت ألول أو الثاني يساوي واحد.

فهو كالجمع: 0+0=0, 0+1=1, 1+0=1, 1+1 =1

أمثلة:

10001001OR 10110110 = 10111111

10010011OR 11110000 = 11110011

ما هي أهمية هذا المعامل في البرمجة؟

لاحظ المثال الثاني: لقد قمنا بإرغام البتات الأربع العليا على أخد القيمة 1 دون أن نمس بقيم البتات الأربع السفلى باستعمال القناع 11110000.

ف باستخدام هذا المعامل يمكنك إرغام أي بت على أخذ قيمة 1 دون المساس بقيم البتات الأخرى, عكس المعامل AND الذي يستعمل للإرغام البت على 0.

أمثلة:

111z1101 OR 0001000= 11111101 قمنا بإرغام البت الخامس على أخذ القيمة 1 دون أن نمس بقيم البتات الأخرى.

11x01z0w OR 00100101 = 11101101 قمنا بإرغام البت الأول والثالث و السادس على 1 دون المساس بقيم باقي البتات.

المعامل أو الإستثائي XOR:

هذا المعامل على عكس معامل OR فهو يقوم بجمع إستثنائي بت مع بت من نفس الرتبة. والناتج يساوي واحد باستثناء إذا كان البت الأول يساوي البت الثاني في القيمة

جدول الحقيقة للمعامل XOR

XOR-Table.gif

نلاحض أن الناتج يكون واحد مادام هناك إختلاف في قيم البت 1 و البت 2.

فكأن هذا المعامل يقوم اختبار التوافق في القيمة للبتين . إن توافقا فصفر وإن اختلفا ف واحد.

أمثلة:

10001000XOR 11000000 = 01001000

11001100XOR 11110000= 00111100

ما هي أهمية هذا المعامل في البرمجة؟

يقوم هذا المعامل بعملية قلب قيمة كل بت مع 1 و يبقي على قيمته مع 0.

أنظر المثال الثاني فقد قمنا بقلب قيم البتات الأربع العلي من 0إلى 1 أو من 1 إلى 0 وأبقينا على قيم البتات الأربع السفلى هذا باستعمال القناع 11110000.

فيمكن أن نقوم بعملية قلب لقيمة بت من 0 إلى 1 أو من 1 إلى صفر دون المساس بالبتات الأخرى فقط باستعمال XOR مع 1

المعامل shl :

هذا المعامل يقوم بعمل إزاحة للبتات نحو اليسار وفق عدد البتات المطلوب وتعويض موضع البتات المزاحة ب0

مثال

10111001SHL 2 = 11100100

00000011 shl 6 = 11000000

هذا المعامل يقوم ببساطة بعملية ضرب البراميتر الأول في قوة العدد 2 للباراميتر الثاني:

x shl n = x * 2^n

أهميته أنهيعتبر أسرع من عملية الضرب العادية في حالة ما إذا كا احد باراميترات عملية الجداء هو قوة من قوى 2.

ملاحظة الباراميتر الثاني لا يمكنه أن يكون عدد سالب ولا أن يتجاوز عدد بتات البراميتر الثاني, مثلا لو كان العدد x من صنف 32 بت فإن n ستأخذ القيم 0 1 2 ...32 فقط...

المعامل shr:

ما قيل على shl يقال على shr.

الفرق هو أن الأول جداء مع قوة من قوى 2 و الثاني هي قسمة على قوة من قوى 2.

shr تقوم بإزاحة عدد من البتات نحو اليمين وتعويض موضع البتات المزاحة ب0

تستخدم كذلك لعزل مجموعة من البتات العليا دون البتات السفلى. مثال

10111001shr 4 = 00001011 قمنا بعزل الأربع بتات العليا و كأننا قسما على 2^4

تم تعديل هذه المشاركة بواسطة ikossan في 1 أبريل 2006 في 20:48

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#11

الله، يا أيكوسان

والله ما توقعت إجابة مفصلّة لهذه الدرجة،، بصراحة انا لم أقرأ كل الشرح بعد، لكن واضح إنك كفيت ووفيت ، فجزاك الله خير الجزاء على ما أعطيت :)

بارك الله فيك، وجعل لكم بكل حرفٍ كتبتم أنت والإخوة حورية من الحور العين في الجنة :)

سؤال صغير: ماذا تقصد بـ " جداء " ؟ ( يبدو أني ضعيف في اللغة العربية، كما أني ضعيف في دلفي :) )

السلام عليكم ورحمة الله وبركاته.

تم تعديل هذه المشاركة بواسطة fafe0 في 2 أبريل 2006 في 10:26

#12

العفو يا أخي fafe0 شكراً لك,

الجداء هي عملية الضرب الرياضية B)

لا عليك فكلنا مبتدئين, ومن إدعى أنه وصل فقد ذهب كل علمه سدا.

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#13

شكراً أخي ikossan على الإجابة والتشجيع :)

هذا الموضوع مغلق.

مواضيع مشابهة