السلام عليكم ورحمة الله وبركاته
اليوم نتحدث عن بعض الاختلافات التطبيقية بين الـ Bitwise Operators والـ Logical Operators تحت مظلة الـ Java
وينصب اهتمامنا على المعاملات AND و OR
أولا
بشكل مبدئى يمكننا اعتبار أن الهدف من Bitwise Operators هو إجراء بعض العمليات على الأعداد فى شكلها الثنائى (Binary Numerals )
بينما الهدف من الـ Logical Operators هو التعامل مع القيم المنطقية (Boolean Values) أو العبارات المنطقية (Boolean Expressions )
ثانيا
بمطالعة Operator Precedence Chart يتضح أن الـ Bitwise Operators لها أولوية أعلى من الـ Logical Operators
هذه معلومة بسيطة إلا أن الجهل بها قد يؤدى إلى أخطاء منطقية نحن فى غنى عنها
ولنجرب الكود الآتى ليظهر الفرق
System.out.println(true||true&&false); //Prints "true"
System.out.println(true| true&&false); //Prints "false"
ثالثا
الـ Logical Operators لها Short-Circuiting Behavior بخلاف الـ Bitwise Operators
لنأخذ على سبيل المثال هذه الجملة
if(booleanMethod1() && booleanMethod2())
هنا يتم فحص(بمعنى استدعاء وفحص القيمة المرجعة) الدالة الأولى أولا فإذا كان الناتج منها true يتم فحص الدالة الثانية أما إذا كان ناتج الدالة الأولى false فلا يتم فحص الدالة الثانية ويتم اعتبار الناتج الكلى false
مثال آخر مع OR
if(booleanMethod1() || booleanMethod2())
هنا يتم فحص الدالة الأولى أولا وإذا كان ناتج الدالة الأولى false يتم فحص الدالة الثانية أما إذا كان ناتج الدالة الأولى true فلا يتم فحص الثانية ويتم اعتبار الناتج الكلى true
والآن سوف نكرر نفس الأمثلة ولكن مع الـ Bitwise Operators
if(booleanMethod1() & booleanMethod2())
هنا يتم فحص الدالة الثانية حتى ولو كان ناتج الأولى false
if(booleanMethod1() | booleanMethod2())
هنا يتم فحص الدالة الثانية حتى ولو كان ناتج الأولى true
للتوضيح أكثر
package bitwisevsconditional;
public class BitwiseVsConditional
{
public static void main(String []args)
{
new MyApplication();
}
}
class MyApplication
{
boolean booleanMethod1()
{
System.out.println("Method1 called!");
return true;
}
boolean booleanMethod2()
{
System.out.println("Method2 called!");
return true;
}
MyApplication()
{
if(booleanMethod1() || booleanMethod2())
{
System.out.println("One of the methods returns true!");
}
}
}
والناتج
Method1 called!
One of the methos returns true!
وإذا قمنا بتغيير | إلى ||
يصبح الناتج
Method1 called!
Method2 called!
One of the methods returns true!
ملاحظة أخيرة
القيم المنطقية true و false يمكن اعتبارها Binary Numerals وبالتالى يجوز التعامل معها باستخدام الـ Bitwise Operators
حيث أن true تقابل one و false تقابل zero
System.out.println(true & true); //This is OK
System.out.println(true && true);//This is OK
إن كان من توفيق فمن الله وحده وإن كان من خطأ فمنى ومن الشيطان