حيل البت العملية
تقنيات شائعة
حيل البت العملية درس مجاني في C Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.
حيل مفيدة للبتات
بمجرد فهمك للمعاملات على مستوى البتات، تصبح مجموعة من الحيل المختصرة متاحة لك. فهي سريعة وتظهر كثيرًا في الشفرة الفعلية.
لنستعرض معًا أكثرها شيوعًا.
#include <stdio.h>
int main(void) {
unsigned x = 6;
printf("x & 1 = %u (odd if 1)\n", x & 1);
return 0;
}زوجي أم فردي
يحدد أقل بت زوجية العدد أو فرديته. تكون x & 1 مساوية لـ 1 للأعداد الفردية و0 للأعداد الزوجية.
#include <stdio.h>
int main(void) {
for (unsigned x = 0; x < 5; x++) {
printf("%u is %s\n", x, (x & 1) ? "odd" : "even");
}
return 0;
}التحقق من قوة العدد اثنين
يكون العدد الموجب قوة للعدد اثنين إذا كان يحتوي على بت مضبوط واحد فقط. يكون التعبير x & (x - 1) مساويًا لـ 0 في هذه الحالة وحدها.
#include <stdio.h>
int is_pow2(unsigned x) {
return x != 0 && (x & (x - 1)) == 0;
}
int main(void) {
printf("%d %d %d\n", is_pow2(16), is_pow2(18), is_pow2(1));
return 0;
}مسح أقل بت مضبوط
يمسح التعبير x & (x - 1) أقل بت مضبوط. ويشكّل هذا أساس العد السريع للبتات المضبوطة.
#include <stdio.h>
int main(void) {
unsigned x = 0b10110;
printf("before: %u\n", x);
printf("after: %u\n", x & (x - 1));
return 0;
}عزل أقل بت مضبوط
يعزل التعبير x & (-x) أقل بت مضبوط، ولا يُبقي مضبوطًا سوى ذلك البت.
يعتمد هذا على تمثيل المتمم الثنائي.
#include <stdio.h>
int main(void) {
unsigned x = 0b10110;
printf("lowest set bit = %u\n", x & (-x));
return 0;
}عدّ البتات المضبوطة
يؤدي مسح أقل بت مضبوط بشكل متكرر إلى حساب عدد البتات المضبوطة، بعدد خطوات يساوي عدد هذه البتات.
#include <stdio.h>
int popcount(unsigned x) {
int n = 0;
while (x) { x &= (x - 1); n++; }
return n;
}
int main(void) {
printf("%d\n", popcount(255));
printf("%d\n", popcount(0b1010));
return 0;
}التبديل دون متغير مؤقت
تبدّل عملية XOR بين عددين صحيحين دون استخدام مساحة تخزين إضافية.
#include <stdio.h>
int main(void) {
int a = 3, b = 8;
a ^= b; b ^= a; a ^= b;
printf("a=%d b=%d\n", a, b);
return 0;
}التقريب إلى أعلى قوة للعدد اثنين
يمكنك تقريب قيمة غير موقعة إلى قوة العدد اثنين التالية عبر نشر البت الأعلى إلى اليمين، ثم إضافة 1.
#include <stdio.h>
unsigned next_pow2(unsigned v) {
v--;
v |= v >> 1; v |= v >> 2; v |= v >> 4;
v |= v >> 8; v |= v >> 16;
return v + 1;
}
int main(void) {
printf("%u\n", next_pow2(17));
printf("%u\n", next_pow2(100));
return 0;
}التحقق من اختلاف البتات
تختلف قيمتان في المواضع التي تحتوي فيها a ^ b على بتات مضبوطة تحديدًا. ويعطي عدّ هذه البتات مسافة هامِنغ.
#include <stdio.h>
int main(void) {
unsigned a = 0b1101, b = 0b1011;
unsigned diff = a ^ b;
int count = 0;
while (diff) { diff &= diff - 1; count++; }
printf("hamming distance = %d\n", count);
return 0;
}القيمة المطلقة دون تفرّع
باستخدام بت الإشارة، يمكنك حساب القيمة المطلقة دون استخدام if. يكون القناع كله 1 للأعداد السالبة، وكله 0 للأعداد غير السالبة.
#include <stdio.h>
int main(void) {
int x = -42;
int mask = x >> 31;
int abs = (x + mask) ^ mask;
printf("abs = %d\n", abs);
return 0;
}ضبط بت حسب الفهرس
ادمج الإزاحة وOR لضبط موضع بت عشوائي يُحسَب أثناء التشغيل.
#include <stdio.h>
int main(void) {
unsigned v = 0;
int positions[] = {1, 3, 5};
for (int i = 0; i < 3; i++) {
v |= (1u << positions[i]);
}
printf("v = %u\n", v);
return 0;
}تحقّق سريع
اختبر معلوماتك عن حيل البتات.
مراجعة
تعلّمت حيل عملية للبتات:
- يفحص
x & 1ما إذا كان العدد فرديًا أو زوجيًا. - يمسح
x & (x - 1)أقل بت مضبوط ويكشف قوى العدد اثنين. - يعزل
x & (-x)أقل بت مضبوط. - عدد البتات المضبوطة، وتبديل XOR، ومسافة هامِنغ، والقيمة المطلقة دون تفرّع.
الأسئلة الشائعة
هل درس «حيل البت العملية» مجاني؟
نعم — نص درس «حيل البت العملية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «حيل البت العملية»؟
تقنيات شائعة تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «حيل البت العملية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المعاملات على مستوى البت
- الإزاحات
- أقنعة البت والأعلام
- حيل البت العملية