الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مقارنة محدودة بين الـ Bitwise Operarors والـ Logical Operators

بدأه (الخوارزمي) في 30 نوفمبر 2012 · 0 رد · 740 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1

السلام عليكم ورحمة الله وبركاته

اليوم نتحدث عن بعض الاختلافات التطبيقية بين الـ Bitwise Operators والـ Logical Operators تحت مظلة الـ Java

وينصب اهتمامنا على المعاملات AND و OR

أولا

بشكل مبدئى يمكننا اعتبار أن الهدف من Bitwise Operators هو إجراء بعض العمليات على الأعداد فى شكلها الثنائى (Binary Numerals )

بينما الهدف من الـ Logical Operators هو التعامل مع القيم المنطقية (Boolean Values) أو العبارات المنطقية (Boolean Expressions )

ثانيا

بمطالعة Operator Precedence Chart يتضح أن الـ Bitwise Operators لها أولوية أعلى من الـ Logical Operators

post-240340-018947600 1354277840_thumb.p

هذه معلومة بسيطة إلا أن الجهل بها قد يؤدى إلى أخطاء منطقية نحن فى غنى عنها

ولنجرب الكود الآتى ليظهر الفرق


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

إن كان من توفيق فمن الله وحده وإن كان من خطأ فمنى ومن الشيطان

المرفقات
OperatorsChart.png
1

مواضيع مشابهة