سؤال

كثيرا ما أستخدم ($var & 1) في الكود الخاص بي، والذي يُرجع صحيحًا إذا $var هو رقم فردي وكاذب إذا كان رقما زوجيا.

ولكن ماذا يفعل "&" في الواقع؟

هل كانت مفيدة؟

المحلول

& غير and ثنائي. إذا كان لديك قيمة ثنائية، وكنت and مع قيمة ثنائية أخرى، فإن النتيجة ستكون and المختصة بالبت من الاثنين. مثال:

  01101010
& 01011001
= 01001000

ووأقصى اليمين قليلا هو إما 1 (وفي هذه الحالة العدد هو عدد فردي) أو أنها 0، وفي هذه الحالة الرقم حتى. إذا كنت & عدد مع 1، لننظر فقط في أقل قليلا كبير، وإذا الشيكات إذا كان الرقم 1 أو 0. كما ذكر آخرون، أن ننظر في مشغلي المختصة بالبت لمزيد من المعلومات حول كيفية عملها.

نصائح أخرى

هناك عمليتان أساسيتان للأنظمة الثنائية هما OR و AND.

OR تعني "إذا كان A قيد التشغيل أو B قيد التشغيل".مثال على العالم الحقيقي سيكون مفتاحين بالتوازي.إذا كان أحدهما يسمح بمرور التيار، فإن التيار يمر عبره.

AND تعني "إذا كان كل من A وB قيد التشغيل".مثال العالم الحقيقي هو مفتاحين في السلسلة.لن يمر التيار إلا إذا كان كلاهما يسمح بمرور التيار.

في الكمبيوتر، هذه ليست مفاتيح فعلية ولكنها أشباه موصلات، ويتم استدعاء وظائفها بوابات المنطق، بوابات منطقية.إنهم يقومون بنفس أنواع الأشياء التي تقوم بها المفاتيح - تتفاعل مع التيار أو لا يوجد تيار.

عند تطبيقها على الأعداد الصحيحة، يتم دمج كل بت في رقم واحد مع كل بت في الرقم الآخر.لذا لفهم معاملات البت OR وAND، تحتاج إلى تحويل الأرقام إلى ثنائي، ثم إجراء العملية OR أو AND على كل زوج من البتات المطابقة.

ذلك هو السبب:

00011011 (odd number)
AND
00000001 (& 1)
== 
00000001 (results in 1)

بينما

00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)

وبالتالي فإن العملية (& 1) تقارن البت الموجود في أقصى اليمين بالرقم 1 باستخدام المنطق AND.يتم تجاهل جميع البتات الأخرى بشكل فعال لأن أي شيء ولا شيء هو لا شيء.الرقم الزوجي في النظام الثنائي هو أيضًا رقم زوجي في التدوين العشري (10 هو مضاعف للرقم 2).

تشمل العمليات الأساسية الأخرى للأنظمة الثنائية NOT وXOR.NOT تعني "إذا كانت A متوقفة عن التشغيل" وهي الشكل الوحيد للبوابة المنطقية التي تأخذ إشارة أو "معلمة" واحدة فقط بدلاً من اثنتين.XOR تعني "إذا كان A أو B قيد التشغيل، ولكن ليس كليهما".ثم هناك NAND وNOR وNXOR، والتي لم يتم دمجها بشكل أساسي مع AND وOR وXOR، أي أن NAND تعني "إذا كان A وB" لا كلاهما موجودان'.

في البرمجة، المشغل

& means AND,
| means OR, 
~ means NOT, and
^ means XOR.

ويمكن تعويض الآخرين من خلال الجمع بين هذه، على سبيل المثال:

~ (a & b) is equivalent to a NAND operation

PHP ملاحظة محددة

لا تعمل عوامل Bitwise على قيم الفاصلة العائمة، وفي PHP سيتم تحويل القيم العائمة ضمنيًا إلى أعداد صحيحة أولاً.سيتم اقتطاع الأرقام الموجودة خارج النطاق والتي يمكن التعبير عنها كأعداد صحيحة إلى صفر - أي أن جميع الأرقام الموجودة فوق PHP_INT_MAX ستبدو "زوجية" في التعبير ($num & 1)).إذا كنت تريد دعم أرقام خارج PHP_INT_MIN/PHP_INT_MAX، فستحتاج إلى fmod($num, 2). ومع ذلك، إذا كنت تستخدم PHP 64 بت، فستتمتع الأعداد الصحيحة بدقة أكبر من الأعداد العائمة على أي حال.

وهذا هو المثير للاهتمام أيضا أن تعرف عن أحادي المعامل وPHP:

/**
 * Regular
 */
echo (true && true); // 1
echo (true && false); // nothing

echo (true || false); // 1
echo (false || false); // nothing

echo (true xor false); // 1
echo (false xor false); // nothing

/**
 * Bitwise
 */
echo (true & true); // 1
echo (true & false); // 0

echo (true | false); // 1
echo (false | false); // 0

echo (true ^ false); // 1
echo (false ^ false); // 0

وبالإضافة إلى إجابات أخرى، ومن الجدير بالذكر أن

if(func1() && func2())

هل الاتصال فقط func2() إذا func1() يعود صحيح ( "تقييم كسول")، في حين

if(func1() & func2())

هل ندعو كل من وظائف بغض النظر، إلا أن جدول الحقيقة لكلا تكون هي نفسها (على افتراض عودتهم القيم المنطقية).


وthomasrutter يشير (في التعليقات أدناه) التي ربما لا ينبغي القيام به هذا الأخير في الممارسة العملية. سوف (A & B) ليس بالضرورة نفس truthiness كما (A && B)، لا سيما عندما A وB أعداد صحيحة. على سبيل المثال، إذا A = 1 و B = 2 (سواء truthy)، A & B سيكون falsey، في حين A && B هو truthy. أيضا، مطور آخر قد تعتقد أن هذا هو الخطأ المطبعي و"صحيحة" لاثنين من اقحام.

وأنا أعرف سؤالك عن فهم المشغل أحادي المعامل والجواب المقبول يفسر ذلك بشكل جيد. ولكن بالنسبة للسبيل المثال تعطي، لا يسعني إلا نوصي بإنشاء استخدام المشغل مودولو بدلا من ذلك:

($var % 2) /* instead of */ ($var & 1)

ولأنه يجعل القصد الواضح أن كنت التحقق من أن الرقم الغريب (لا للتقسيم من قبل اثنين)، وهذا هو أكثر عمومية، بحيث يمكنك استخدام ($ فار 3٪) بنفس الطريقة ونستنتج كيف يعمل ل أي N.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top