الإزاحات
الإزاحة إلى اليسار واليمين
الإزاحات درس مجاني في C Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.
إزاحة البتات
تنقل معاملات الإزاحة جميع بتات العدد الصحيح إلى اليسار أو اليمين بعدد من المواضع.
إزاحة اليسار هي <<، وإزاحة اليمين هي >>.
#include <stdio.h>
int main(void) {
unsigned x = 1;
printf("1 << 3 = %u\n", x << 3);
return 0;
}إزاحة اليسار تضاعف القيمة
تؤدي الإزاحة إلى اليسار بمقدار n من المواضع إلى ضرب قيمة غير موقعة في 2 مرفوعة إلى القوة n.
القيمة 1 << 3 تساوي 8، والقيمة 5 << 1 تساوي 10.
#include <stdio.h>
int main(void) {
printf("5 << 1 = %u\n", 5u << 1);
printf("3 << 4 = %u\n", 3u << 4);
return 0;
}إزاحة اليمين تقسم القيمة
تؤدي الإزاحة إلى اليمين بمقدار n إلى قسمة قيمة غير موقعة على 2 مرفوعة إلى القوة n، مع تجاهل البتات التي تخرج من الطرف الأيمن.
القيمة 20 >> 2 تساوي 5.
#include <stdio.h>
int main(void) {
printf("20 >> 2 = %u\n", 20u >> 2);
printf("7 >> 1 = %u\n", 7u >> 1);
return 0;
}قوى العدد اثنين
تُعدّ إزاحة 1 إلى اليسار أسرع طريقة لتوليد قوى العدد اثنين.
القيمة 1 << n هي القوة n للعدد اثنين.
#include <stdio.h>
int main(void) {
for (int n = 0; n < 6; n++) {
printf("2^%d = %u\n", n, 1u << n);
}
return 0;
}تصوير الإزاحة
توضح طباعة البتات قبل الإزاحة وبعدها كيفية انزلاق النمط.
#include <stdio.h>
void print_bits(unsigned char v) {
for (int i = 7; i >= 0; i--) putchar((v >> i) & 1 ? '1' : '0');
putchar('\n');
}
int main(void) {
unsigned char v = 0b00000110;
print_bits(v);
print_bits(v << 2);
return 0;
}استخراج بت
لقراءة البت رقم i، أزيحوا القيمة إلى اليمين بمقدار i ثم أجروا عملية mask باستخدام 1.
تكون النتيجة 0 أو 1.
#include <stdio.h>
int main(void) {
unsigned v = 0b10110;
for (int i = 0; i < 5; i++) {
printf("bit %d = %u\n", i, (v >> i) & 1);
}
return 0;
}بناء قيمة بتًا بتًا
يمكنكم تجميع عدد بإزاحة البتات إلى مواضعها ثم دمجها باستخدام OR.
#include <stdio.h>
int main(void) {
unsigned v = 0;
v |= (1u << 0);
v |= (1u << 2);
v |= (1u << 4);
printf("v = %u\n", v);
return 0;
}تنبيه بشأن إزاحة العدد الموقّع إلى اليمين
تُحدَّد إزاحة عدد صحيح سالب موقّع إلى اليمين وفقًا للتنفيذ؛ فقد تنسخ بت الإشارة.
لإجراء عمليات بتات يمكن التنبؤ بها، يُفضّل استخدام الأنواع unsigned.
#include <stdio.h>
int main(void) {
int s = -8;
printf("-8 >> 1 = %d (implementation-defined)\n", s >> 1);
unsigned u = 8;
printf("8u >> 1 = %u\n", u >> 1);
return 0;
}تجنّب الإزاحة الزائدة
تُعدّ الإزاحة بمقدار أكبر من عرض النوع أو مساويًا له سلوكًا غير معرّف.
لا يُسمح بإزاحة قيمة بحجم 32 بت بمقدار 32 أو أكثر.
#include <stdio.h>
#include <limits.h>
int main(void) {
printf("unsigned has %zu bits\n", sizeof(unsigned) * CHAR_BIT);
printf("Safe shift 1u << 31 = %u\n", 1u << 31);
return 0;
}دمج الإزاحة والقناع
تُستخدم الإزاحة والقناع معًا لاستخراج حقل يتكوّن من عدة بتات. نستخـرج هنا البتات الأربعة الوسطى من بايت.
#include <stdio.h>
int main(void) {
unsigned v = 0b11010110;
unsigned field = (v >> 2) & 0b1111;
printf("field = %u\n", field);
return 0;
}الضرب والجمع السريعان
يتيح دمج عمليات الإزاحة الضرب في ثوابت بسرعة. فالضرب في 10 يساوي الإزاحة بمقدار 3 (أي الضرب في 8) مضافًا إليها الإزاحة بمقدار 1 (أي الضرب في 2).
#include <stdio.h>
int main(void) {
unsigned x = 7;
unsigned times10 = (x << 3) + (x << 1);
printf("7 * 10 = %u\n", times10);
return 0;
}تحقّق سريع
اختبر معلوماتك عن عمليات الإزاحة.
مراجعة
تعلّمت معاملات الإزاحة:
<<تُزيح إلى اليسار وتضرب في قوى العدد اثنين.>>تُزيح إلى اليمين وتقسم على قوى العدد اثنين.(v >> i) & 1تستخرج بتًا واحدًا.- استخدم
unsignedللحصول على إزاحات يمكن التنبؤ بها، ولا تُجرِ إزاحة بمقدار عرض النوع أو أكثر.
الأسئلة الشائعة
هل درس «الإزاحات» مجاني؟
نعم — نص درس «الإزاحات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «الإزاحات»؟
الإزاحة إلى اليسار واليمين تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «الإزاحات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.