مضى على الشبكة و يوم من العطاء.

[ شرح ] لغة C | العوامل البتية 0x10

N0Tb1t

./عضو جديد
>:: v1p ::<

firefox
linux

السمعة:

السلام عليكم
بسم الله والصلاة والسلام على رسول الله وعلى آله وصحبه ومن والاه


من هذا المقال سنتعامل مع لغة C بالأمور الlow level
قبل البداية في هذه السلسلة يجب ان تكون على معرفة باساسيات لغة C يمكنك الاتطلاع على اساسيات لغة C الي نشرتها بالشبكة ،على بركة الله

في هذا المقال سنشرح ال ternary operator وال bitwise operators وال increment and decrement
وصراحة انا لم اشرح الoperators العامة التي نتعامل معها في الرياضيات كالجمع والطرح والقسمة والضرب لانها امور بديهية وسهل التعامل معها فـ هي السلسلة فيها امور اقوى من الامور الاساسية الي بتشوف اي مبرمج بيعرفها وان شاء الله تكون هذه السلسلة تمكين للاساسيات الي حكينا عليها بأول سلسلة رح نركز عالامثلة العملية

شو هي عوامل البت وليش منتعلما ؟
هي عوامل منستخدما للتلاعب بالبتات الفردية بالأرقام، وهي مفيدة بالبرمجة منخفضة المستوى لتعاملها مع الباينري (0 و1)
متل أنظمة التحكم

رح نشرح بالتفصيل شو هي عوامل البت الستة:
1.AND Operator( & ):
هاد العامل شبيه لعملية الضرب بالجبر الرياضي.

WhatsApp Image 2025-06-13 at 11.21.16 PM.webp


مثال نظري:
نختار الرقمين 3، 5:
5: 0101 بالنظام الثنائي
3: 0011

3&5 = 0001 بصير يساوي 1 بالنظام العشري

مثال:
C:
#include <stdio.h>

int main(){
    int a = 5; // 0101
    int b = 3; // 0011
    int result = a & b; // 0001
   
    printf("5 & 3 = &d\n", result); // النتيجة = 1
   
    return 0;
}

2.OR Operator ( | ):
إذا كانت وحدة من القيمتين واحد ف بتكون القيمة = 1.

WhatsApp Image 2025-06-15 at 8.11.54 AM.webp


مثال نظري:
5 | 3 = 0111 يعني يساوي ال7 بالعشري.

مثال برمجي:
C:
#include <stdio.h>

int main(){
    int a = 3; //0011
    int b = 5; //0101
    int result = a | b; //0111
    printf("3 | 5 = %d\n", result); // النتيجة 7
   
    return 0;
}

3.XOR Operator( ^ ):
بس كانوا البتين مختلفين بتكون القيمة = 1.

WhatsApp Image 2025-06-15 at 8.20.37 AM.webp


مثال نظري:
5 ^ 3 = 0110 (يعني بيساوي 6 بالعشري).

مثال برمجي:
C:
#include <stdio.h>

int main() {
    int a = 5; // 0101
    int b = 3; // 0011
    int result = a ^ b;
    printf("5 ^ 3 = %d\n", result);
   
    return 0;
}

4. NOT Operator ( ~ ):
بيقلب حميع البتات للرقم

WhatsApp Image 2025-06-15 at 8.29.07 AM.webp


مثال نظري:
- 5 : 000001010
- ~5 : 111110101

بال tow's complement بيساوي ال -6. الي ما بيعرف شو هو ال tow's complement رح ارفق ملف فيه الnumber systems.

مثال برمجي:
C:
#include <stdio.h>

int main(){
    int a = 5;
    int result = ~a;
    printf("~5 = %d\n", result);
   
    return 0;
   
}

5. Left Shift( >> ):
بينقل البتات الى اليسار حسب كم خطوة نحنا منكون محددينلو والبتات الي بتضل فارغة بيملأها ب0.

مثال نظري:
1 >> 5: الخمسة بالثنائي 0101
بتصير 1010 بالعشري بتصير بتساوي ال 10

2 >> 5: 0101
بتصير 10100 بالعشري بتساوي ال20.

مثال برمجي:
C:
#include <stdio.h>

int main(){
    int a = 5;
    int result1 = a << 1;
    int result2 = a << 2;
    printf("a << 1 = %d\n", result1);
    printf("a << 2 = %d\n", result2);
   
    return 0;
}

6. Right Shift ( << ):
متل الleft بس هون بينقل البتات الى اليمين.

مثال نظري:
1 << 10: العشرة بالباينري 1010
بتصير 0101 بالعشري بتساوي ال5.

2 << 10: 1010
بتصير 0010 بالعشري بتساوي ال2

مثال برمجي:
C:
#include <stdio.h>

int main(){
    int a = 10;
    int result1 = a >> 1;
    int result2 = a >> 2;
    printf("10 >> 1 = %d\n", result1);
    printf("10 >> 2 = %d\n", result2);
   
    return 0;
}

مثال شامل عن عوامل التعيين البتية:

C:
int a = 5; // 0101
a &= 3; // a = a & 3 => 0101 & 0011 = 0001
printf("%d\n", a); // النتيجة: 1

a = 5;
a |= 3; // a = a | 3 => 0101 | 0011 = 0111
printf("%d\n", a); // النتيجة: 7

a = 5;
a ^= 3; // a = a ^ 3 => 0101 ^ 0011 = 0110
printf("%d\n", a); // النتيجة: 6

a = 5;
a <<= 1; // a = a << 1 => 0101 << 1 = 1010
printf("%d\n", a); // النتيجة: 10

a = 10;
a >>= 1; // a = a >> 1 => 1010 >> 1 = 0101
printf("%d\n", a); // النتيجة: 5

رح ارفق ملف كمان لل logic gates مشان يكون الفهم اعمق طبعا مهم جدا انك تفهمن بالdigital system

هلأ رح نحكي عن الInermenet and Decrement Operators:
عوامل الزيادة والنقصان:

هي عوامل احادية (unary operators) تستخدم لزيادة او تقليل قيمة المتغير بمقدار 1 ولها نوعين:
1. Perfix( ++x, --x):
قيم زيادة قيمة المتغير أول الشي وبعدين بتستخدم القيمة الجديدة بالتعبير الي عم نشتغل عليه.

2. Postfix( x++, x--):
قيم الاستخدام الاصلية وبعدين منزيد على قيمة المتغير.

وعوامل النقصان نفس الشي; طبعا هي عادة بتستخدم مع الاعداد الصحيحة بس كمان فينا نستخدما مع المؤشرات والfloating points.

مثال:
C:
int x = 5;
printf("%d\n", ++x); // النتيجة: 6 (زيادة أولاً، ثم طباعة)
x = 5;
printf("%d\n", x++); // النتيجة: 5 (طباعة أولاً، ثم زيادة)
printf("%d\n", x);   // النتيجة: 6 (بعد الزيادة)

خلينا ناخد مثال عالمؤشرات:
C:
int arr[] = {1, 2, 3, 4};

int *p = arr;
printf("%d\n", *p++); // طباعة 1 ثم تحريك المؤشر الى العنصر التالي
printf("%d\n", *p); // طباعة العنصر التاني = 2

طيب سبق و حكينا عن الternary operator بس ما توسعنا فيه.

العامل الثلاثي (ternary operator) ( ?: ):

هو العامل الوحيد الشرطي في لغة C وحكينا عنو من قبل ومنستخدمو كبديل ل if, else

syntax:
كود:
Condition ? exp1 : exp2

اذا كان الcondition صحيح بياخد الexp1
واذا كان غلط بياخد الexp2

مثال:
C:
#include <stdio.h>

int main(){
    int x = 10, y = 5;
    int max = (x > y) ? x : y;
    printf("the bigger: %\n", max);
   
    return 0;
}

صراحة بشوف هاد الموضوع جدا ضروري تعلمه وان شاء الله الامور الجاي بتكون الموضوعات اهم.
 

المرفقات

التعديل الأخير:
  • Love
التفاعلات: Mina
وعليكم السلام ورحمة الله تعالى وبركاته , مثل ما تفضلت العمليات الحسابية بديهيات وتفضلت بشرح and /or التي تستعمل بكثرة في البرمجة ونجدها مثلا في التعليمات الشرطية لكن السؤال وين ممكن نلاقي right/left shift ? او ليه بنستعملها 🤔 لانه لازم نطرح سؤال لماذا?ولاي هدف بدي اعمل ازاحة للبتات
5. Left Shift( >> ):
بينقل البتات الى اليسار حسب كم خطوة نحنا منكون محددينلو والبتات الي بتضل فارغة بيملأها ب0.

مثال نظري:
1 >> 5: الخمسة بالثنائي 0101
بتصير 1010 بالعشري بتصير بتساوي ال 10

2 >> 5: 0101
كانت 5 ولما عملنا ازاحة على اليسار صارت 10 صح ? مش ممكن الازاحة على اليسار تمثل مفهوم الضرب في 2?
6. Right Shift ( << ):
متل الleft بس هون بينقل البتات الى اليمين.

مثال نظري:
1 << 10: العشرة بالباينري 1010
بتصير 0101 بالعشري بتساوي ال5.

2 << 10: 1010
بتصير 0010 بالعشري بتساوي ال2

مثال برمجي:
كانت 10 وعملنا ازاحة على اليمين فصارت 5 الا يعني ذلك ان الازاحة على اليمين تمثل مفهوم القسمة على 2 ?
وبهذا فينا نستخدم المفهومين الان .
جزاك الله خيرا على الطرح ونفع الله بك استمر .​
 
وعليكم السلام ورحمة الله تعالى وبركاته , مثل ما تفضلت العمليات الحسابية بديهيات وتفضلت بشرح and /or التي تستعمل بكثرة في البرمجة ونجدها مثلا في التعليمات الشرطية لكن السؤال وين ممكن نلاقي right/left shift ? او ليه بنستعملها 🤔 لانه لازم نطرح سؤال لماذا?ولاي هدف بدي اعمل ازاحة للبتات
حياك الله
الإزاحة بتكون لتوفير الذاكرة وممكن نشوفها بكتير قصص متل الbitfields ان شاء الله المقال الجاي رح احكي عنها ان شاء الله بالمقال القادم

كانت 5 ولما عملنا ازاحة على اليسار صارت 10 صح ? مش ممكن الازاحة على اليسار تمثل مفهوم الضرب في 2?

كانت 10 وعملنا ازاحة على اليمين فصارت 5 الا يعني ذلك ان الازاحة على اليمين تمثل مفهوم القسمة على 2 ?
وبهذا فينا نستخدم المفهومين الان .
جزاك الله خيرا على الطرح ونفع الله بك استمر .​
صحيح هاد الكلام ولهيك الازاحة هي أسرع من الضرب والقسمة لهيك كمان بنستخدمها لتحسين الاداء
بارك الله فيك
 
  • Love
التفاعلات: Mina
كانت 5 ولما عملنا ازاحة على اليسار صارت 10 صح ? مش ممكن الازاحة على اليسار تمثل مفهوم الضرب في 2?

كانت 10 وعملنا ازاحة على اليمين فصارت 5 الا يعني ذلك ان الازاحة على اليمين تمثل مفهوم القسمة على 2 ?
ممكن كمان ندقق الكلام انو الازاحة هي هي متل عمليات الضرب والقسمة لقوى العدد 2
يعني ( 2 >> 5) = 5 * 2²

طبعاً التعامل مع هي الامور ما بتوقع كتير منشوفو لان بيكون بالأنظمة المدمجة ال embadded sys

وممكن نشوفا بالتشفير والضغط
 
طبعاً التعامل مع هي الامور ما بتوقع كتير منشوفو لان بيكون بالأنظمة المدمجة ال embadded sys

وممكن نشوفا بالتشفير والضغط
تعاملت مع الإزاحة عند التعامل مع عناوين IP
صراحة لا اعرف هل هذه الطريقة هي الأفضل لكنها نجحت و أعطت نتائج صحيحة

شكرا على الموضوع و السلسلة
الله يزيدك علم و معرفة
 
تعاملت مع الإزاحة عند التعامل مع عناوين IP
صراحة لا اعرف هل هذه الطريقة هي الأفضل لكنها نجحت و أعطت نتائج صحيحة

شكرا على الموضوع و السلسلة
الله يزيدك علم و معرفة
صحيح كمان بتفيد بالنيتورك والسوكيت

العفو ،الله يبارك فيك
 

آخر المشاركات

عودة
أعلى