ما المقصود بإزاحة البتات؟
إزاحة البتات هي عملية تحريك الأرقام الثنائية لعدد صحيح نحو اليسار أو اليمين بعدد محدد من المواضع. وتُعدّ هذه العملية من أساسيات البرمجة، وتحسين الأداء على المستوى المنخفض، والرسوميات، والتجزئة (Hashing)، والأنظمة المدمجة. فعند تنفيذ الإزاحة لليسار (n << k) تتحرك البتات نحو الطرف الأكثر أهمية (الأعلى قيمة) مع ملء الفراغات بأصفار، بينما الإزاحة لليمين (n >> k) تحرّك البتات نحو الطرف الأقل أهمية.
كيفية استخدام الحاسبة
أدخل العدد الصحيح n، ومقدار الإزاحة k (بعدد البتات)، ثم اختر الاتجاه. ستعرض لك الحاسبة القيمة العشرية الناتجة. تعتمد هذه الأداة على حسابات الأعداد الصحيحة ذات الإشارة بطول 64 بت، بما يتوافق مع سلوك معظم لغات البرمجة.
شرح المعادلة
كل إزاحة لليسار بمقدار موضع واحد تضاعف العدد، لذا فإن الإزاحة لليسار بمقدار k مواضع تعني الضرب في \(2^{k}\):
$$\text{Result} = \text{Number (n)} \ll \text{Shift (k)} = n \times 2^{k}$$أما كل إزاحة لليمين بمقدار موضع واحد فتقسم العدد على اثنين مع اقتطاع الكسور، وبذلك تكون الإزاحة لليمين بمقدار k قسمة صحيحة على \(2^{k}\):
$$\text{Result} = \text{Number (n)} \gg \text{Shift (k)} = \left\lfloor \frac{n}{2^{k}} \right\rfloor$$ولهذا السبب تكون الإزاحة أرخص بكثير من عمليتي الضرب أو القسمة على مستوى العتاد.
مثال محلول
لنأخذ \(n = 16\) ونزيحه لليسار بمقدار \(k = 2\). العدد 16 في النظام الثنائي هو 10000. وعند إزاحته لليسار مرتين يُضاف صفران في النهاية ليصبح 1000000، أي ما يساوي 64. ورياضيًا:
وفي الاتجاه المعاكس:
$$64 \gg 2 = \left\lfloor \frac{64}{4} \right\rfloor = 16$$فنعود إلى القيمة الأصلية.
جدول مرجعي لقوى العدد اثنين
الإزاحة لليسار بمقدار \(k\) تضرب عدداً في \(2^k\)؛ والإزاحة لليمين بمقدار \(k\) تقسمه على \(2^k\) (مع تجاهل الباقي للأعداد الصحيحة). استخدم هذا الجدول لقراءة المضروب أو المقسوم عليه لمقدار إزاحة معين على الفور.
| الإزاحة \(k\) | \(2^k\) (عشري) | معنى \(\ll k\) / \(\gg k\) |
|---|---|---|
| 0 | 1 | بدون تغيير |
| 1 | 2 | \(\times 2\) / \(\div 2\) |
| 2 | 4 | \(\times 4\) / \(\div 4\) |
| 3 | 8 | \(\times 8\) / \(\div 8\) |
| 4 | 16 | \(\times 16\) |
| 5 | 32 | \(\times 32\) |
| 6 | 64 | \(\times 64\) |
| 7 | 128 | \(\times 128\) |
| 8 | 256 | \(\times 256\) (1 بايت) |
| 9 | 512 | \(\times 512\) |
| 10 | 1,024 | \(\times 1024\) (1 كيبيبايت) |
| 11 | 2,048 | \(\times 2048\) |
| 12 | 4,096 | \(\times 4096\) |
| 13 | 8,192 | \(\times 8192\) |
| 14 | 16,384 | \(\times 16384\) |
| 15 | 32,768 | \(\times 32768\) |
| 16 | 65,536 | \(\times 65536\) (2 بايت) |
| 17 | 131,072 | |
| 18 | 262,144 | |
| 19 | 524,288 | |
| 20 | 1,048,576 | \(\times\) 1 ميبيبايت |
| 32 | 4,294,967,296 | حد 32-بت |
| 63 | 9,223,372,036,854,775,808 | البت الأعلى لعدد صحيح موقّع 64-بت |
الأسئلة الشائعة
هل يمكن أن تفقد الإزاحة لليسار بعض البيانات؟ نعم — تُهمل البتات التي تتجاوز عرض العدد (تجاوز السعة أو Overflow). أما ضمن نطاق 64 بت فتحافظ هذه الحاسبة على القيمة.
ماذا يحدث للأعداد السالبة عند الإزاحة لليمين؟ تستخدم هذه الحاسبة الإزاحة الحسابية لليمين (ذات الإشارة)، حيث يُحفظ بت الإشارة فتبقى الأعداد السالبة سالبة.
لماذا نستخدم الإزاحة بدلًا من الضرب أو القسمة؟ لأن إزاحة البتات تُنفَّذ غالبًا في دورة معالجة واحدة على معظم المعالجات، ما يجعلها وسيلة سريعة للضرب أو القسمة على قوى العدد 2.