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

كيف أمرر " | " في البارمترات

مغلق
بدأه Abdullah.Alshammeri في 7 مارس 2006 · 7 رد · 656 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

اريد انشئ دالة شبية بالدوال المعههودة مثلا ..

Set( GL_ONE  |  GL_THREE )

كيف استطيع انشاء دالة تقبل استخدام هذا المؤثر |

======

سؤال اخر .

ماذا تعني هذه العملية ..

 int a ; 

 a  =  9; 

	a  |=  3;

اقصد هذا بالتحديد .... =|

إن شاء الله ما تكون الاسئلة مكررة ومملة ...

glDrawPixel__.zip

تم تعديل هذه المشاركة بواسطة الشمري في 29 يوليو 2007 في 07:51

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

هذا الOperator هو عملية الLogical Bitwise OR

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#3

كلام البشمنهدس صح و أنا حشرح إيه هو ال Logical Bitwise OR

بص يا أخ شمري

علشان تعرف ده لازم الأول تكون عارف النظام الثنائي

و المقال ده ممتاز /index.ph...%E4%CE%DD%D6%C9

طب و بعدين

المعامل OR بيعمل إيه بالظبط

هو بيدخل على 2 بيت و يشوفهم لو كان قيمة أي واحد فيهم 1 يبقى الناتج 1 و إلا يبقى الناتج 0

يعني مثلا ده جدول الحقيقة له

0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1

طيب بشكل أوسع شوية لو عندنا عددين مثلا هم

10110101 OR
11000100 =
11110101

طيب و بعدين إذاي نستخدم ده في عمل دالة ذي دي

أول حاجة نعمل enum مثلا كالتالي

enum count
{
  GL_ONE = 1,
  GL_TWO = 2,
  GL_THREE = 4,
  GL_FOUR = 8,
  GL_FIVE = 16
  GL_SIX = 32
  GL_SEVEN = 64
  GL_EIGHT = 128
}

مش ملاحظ حاجة ???
لنجرب تمثيل هذه الثوابت ثنائيا
[CODE]GL_ONE = 00000001
GL_TWO = 00000010
GL_THREE = 00000100
GL_FOUR = 00001000
GL_FIVE = 00010000
GL_SIX = 001000000
GL_SEVEN = 010000000
GL_EIGHT = 10000000

الأن لماذا تم تمثيل هذه الثوابت بهذه الطريقة بحيث أن يحتوي كل ثابت على خانة واحدة فقط قيمتها 1 تختلف عن أي خانة في باقي

الثوابت ???

الجواب هو لأن الدالة التي سنقوم بإنشائها ستستقبل متغير واحد فقط عبارة عن كائن count من النوع enum مثلا

ثم تحلل كل خانة فيها و ترى إذا كان بها القيمة 1 أو 0 بإستخدام الLogical Bitwise And Operator

و الأن نأتي لشرحه

هذا المعامل يستقبل أيضا 2 بيت و لكن يعيد 1 إذا و إذا فقط كانوا الإثنان 1 و لو كان أي واحد منهم صفر فإنهم يعيد صفر

هذا جدول الحقيقة له

0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1

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

الحل كالأتي

إذا كنا عندنا عدد مثلا هو

10001101

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

AND

بين الرقم الذي بالأعلى و بين الرقم

00000001

لاحظ الأصفار السبعة باليسار التي ستؤدي إلى تصفير الخانات السبع باليسار بالناتج مها كانت قيمتهم في العدد الذي بالأعلى و يتبقى

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

والأن بالنسبة للكود النهائي فهذا مثال تطبيقى على الموضوع

enum count
{
  GL_ONE = 1,
  GL_TWO = 2,
  GL_THREE = 4,
  GL_FOUR = 8,
  GL_FIVE = 16
  GL_SIX = 32
  GL_SEVEN = 64
  GL_EIGHT = 128
}
void Set(count c)
{
   if(c & GL_ONE)
   {
      // GL_ONE is enabled do some coding
   }
   if(c & GL_TWO)
   {
      // GL_TWO is enabled do some coding
   }
   // repeat until you finish processing all the possible values
   
}
void main()
{
   Set(GL_ONE | GL_THREE)
}

و الأن لنتتبع البرنامج

الدالة main تقوم بإنشاء كائن و تطبق عليه عملية

OR

كالتالي

GL_ONE | GL_THREE =
00000001 OR
00000100 =
00000101

هذا هو الناتج النهائي الذي يتم إرساله إلى Set

ثم تقوم Set بعمل AND للناتج مع 00000001

00000101 &
00000001 =
00000001

أي أن الناتج النهائي ليس بصفر فيتم ترقيته إلى true و هذا معناه أنا المستخدم قام بإرسال GL_ONE

ثم تقوم Set بالتأكد من الخانة الثانية بعمل AND أيضا كما بالكود الذي بالأعلى كالأتي

00000101 &
00000010 =
00000000

أي أن المبرمج لم يقم بإرسال GL_TWO و يتم ترقية الناتج إلى false

ثم ماحدث ل GL_ONE يحدث ل GL_THREE

أرجو أن يكون الشرح واضح

و في إنتظار أي إستفسارات :)

تم تعديل هذه المشاركة بواسطة usama707 في 8 مارس 2006 في 03:38

#4

السلام عليكم ،،

int a = 9;

9 بالنظام الثنائي 1 100

و 3 بالنظام الثنائي 0011

a|=3

| يعني OR يعني جمع ثنائي .

اجمع الاثنين 1001

+ 0011

-------------------

0 0 1 1

و الناتج هو 12 بالعشري يعني 9 + 3 = 12 :)

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#5

حيا الله اخونا احمد صالح اشتقنا لك اخى والحمد لله على سلامتك ..

بالنسبة لعملية | فهى عملية منطقية وليست عملية جمع لاحظ ان

1001|0001 = 1001

وليس

1010

كما هو الحال بالنسبة للجمع

بطريقة شرحك المفروض 9+1=10

ولكن الحال هنا هو

9 | 1 = 9

ارجو ان يكون الفرق واضح

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#6

و الله مريض جداً إلي الان

OR تعني جمع منطقي

0 OR 0 = 0

0 OR 1 = 1

1 OR 0 = 1

1 OR 1 = 1

نعم ، انا اللي ذكرته 1001 + 0011 و اعطي 12 و هي عملية جمع

الفرق في ان 1 | 1 = 1 و ليس 0 و الcarry 1 مثل الجمع العادي .

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#7

اسئل الله العلي القدير ان يشفيك عاجل غير اجل..

كفارة إن شاء الله اخي احمد, و إن شاء الله ازمة وتعدي.

ابقى طمنا عليك كل يوم او على الاقل ادخل المنتدى ولو فترة بسيطة عشان نفضل على تواصل..

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#8

حاضر إن شاء الله احاول ... و الله لابس كمامه و شغال بخاخات و جهاز للازمات ... : (

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

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

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