فهم تلاعب البتات في C++
تعد تلاعب البتات جانبًا حيويًا من برمجة الكمبيوتر، خاصةً في برمجة الأنظمة واللغات منخفضة المستوى مثل C و C++. إحدى العمليات الأساسية هي القدرة على تلاعب بتات فردية من رقم. يمكن أن تعزز هذه التقنية الأداء وتوفر تحكمًا دقيقًا على تمثيل البيانات والعمليات.
في هذه المقالة، سوف نستكشف تعيين، مسح، وتبديل بت واحد في عدد صحيح باستخدام C++. سنتطرق أيضًا إلى كيفية التحقق من قيمة بت وتعديل بت بناءً على حالته.
تعيين بت
لتعيين بت n
من رقم إلى 1
، يمكننا استخدام العامل OR بتwise (|
). يتيح لنا هذا العامل دمج نمطين من البت، مما ينتج 1
حيثما كان أحد العاملين يحتوي على 1
.
إليك كيفية تنفيذ ذلك:
typedef unsigned long Uint;
inline Uint bit_set(Uint number, Uint n) {
return number | ((Uint)1 << n);
}
ملاحظة هامة:
كن حذرًا من عدم تحويل موضع بت أكبر من عرض
Uint
، حيث يؤدي ذلك إلى سلوك غير محدد.
مسح بت
لمسح بت n
(تعيينه إلى 0
)، نستخدم العامل AND بتwise (&
). أولاً، نحتاج إلى عكس البت باستخدام العامل NOT بتwise (~
). إليك التنفيذ:
inline Uint bit_clear(Uint number, Uint n) {
return number & ~((Uint)1 << n);
}
تبديل بت
أحيانًا، قد تحتاج إلى تغيير حالة بت من 1
إلى 0
أو من 0
إلى 1
. تُعرف هذه العملية بتبديل البت، ويمكن تحقيقها بكفاءة باستخدام العامل XOR بتwise (^
):
inline Uint bit_toggle(Uint number, Uint n) {
return number ^ ((Uint)1 << n);
}
التحقق من بت
على الرغم من أنه لم يُطلب ذلك في البداية، من الضروري معرفة كيفية التحقق مما إذا كان بت معين هو 1
أو 0
. إليك كيفية تنفيذ ذلك باستخدام العمليات بتwise:
inline bool bit_check(Uint number, Uint n) {
return (number >> n) & (Uint)1;
}
تغيير بت n إلى x
إذا كنت ترغب في تغيير بت n
إلى قيمة محددة x
(0
أو 1
)، فإن أفضل نهج هو أولاً مسح البت (باستخدام bit_clear
) ثم تعيينه إلى القيمة المطلوبة (باستخدام bit_set
). إليك دالة بسيطة لتحقيق ذلك:
inline Uint bit_set_to(Uint number, Uint n, bool x) {
return (number & ~((Uint)1 << n)) | ((Uint)x << n);
}
تم اختبار هذه الوظائف لتحقيق أفضل إنتاج للكود باستخدام مجمعات مثل GCC وclang. يمكنك رؤية أدائها على Godbolt.
باختصار، فهم وتطبيق تقنيات تلاعب البتات هذه يمكّنك من كتابة كود أكثر كفاءة وفعالية في C++. إتقانها يمكن أن يمكنك من مواجهة مشكلات أكثر تعقيدًا بسهولة!