العوامل التي تستخدم للتعامل مع الـ bits (Bitwise Operators) في جافا

 


ماهي العوامل التي تستخدم للتعامل مع الـ bits (Bitwise Operators)

إسم العاملرمزهمثالشرح الكود
Bitwise AND&a & bالعامل & يحسب ناتج جمع الـ bits المشتركة بين a و b
Bitwise OR|a | bالعامل | يحسب ناتج جمع الـ bits المشتركة و الغير مشتركة بين a و b
Bitwise XOR^a ^ bالعامل ^ يحسب ناتج جمع الـ bits الغير مشتركة بين a و b
Bitwise compliment OR~~aالعامل ~ يقلب الـ bits التي تساوي 0 إلى 1 و يقلب الـ bits التي تساوي 1 إلى 0,
ثم يضيف عليهم 1 و يحسب ناتج جمعهم, بعدها يضرب الجواب بالعامل - ) ثم يعطينا جواب سلبي.
Left shift<<a << 2العامل << يزيح الـ bits من آخر اليسار إلى أول اليمين.
العدد 2 يعني أننا سنزيح آخر إثنين bits و نضعهم في الأول.
Right shift>>a >> 2العامل >> يزيح الـ bits من أول اليمين إلى آخر اليسار.
العدد 2 يعني أننا سنزيح أول إثنين bits و نضعهم في الأخير.
Zero fill right shift>>>a >>> 2العامل >>> يزيح الـ bits من أول اليمين ثم يبدلهم بأصفار و يضعهم في آخر اليسار.
العدد 2 يعني أننا سنمسح أول إثنين bits و نضع بدالهم صفرين في الأخير.

شرح العوامل التي تستخدم للتعامل مع الـ bits (Bitwise Operators) في جافا

العامل & (Bitwize AND)

العامل & يحسب ناتج جمع الـ bits المشتركة بين قيمتين.

مثال العامل & (Bitwize AND)

Main.java
      public class Main {

      public static void main(String[] args) {

      int a = 10;      // a = 10 = 00000000000000000000000000001010
      int b = 75;      // b = 75 = 00000000000000000000000001001011

      int c = a & b;   // شرحنا كيف سيتم الحصول على الناتج تحت نتيجة التشغيل

      System.out.print(a+ " & " +b+ " = " +c);

      }

      }
    

سنحصل على النتيجة التالية عند التشغيل.

      10 & 75 = 10
    

 هنا قمنا بتعليم الـ bits المشتركة و التي تم جمعها باللون الاصفر.

a = 10; &nbsp &nbsp&nbsp // 10 = 00000000000000000000000000001010
b = 75; &nbsp &nbsp&nbsp // 75 = 00000000000000000000000001001011

c = a & b; &nbsp //&nbsp c = 00000000000000000000000000001010
&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp&nbsp //&nbsp c = 10


جافا العامل | (Bitwize OR)

العامل | يحسب ناتج جمع الـ bits المشتركة و الغير مشتركة بين قيمتين.

مثال العامل | (Bitwize OR)

Main.java
      public class Main {

      public static void main(String[] args) {

      int a = 10;      // 10 = 00000000000000000000000000001010
      int b = 75;      // 75 = 00000000000000000000000001001011

      int c = a | b;   // شرحنا كيف سيتم الحصول على الناتج تحت نتيجة التشغيل

      System.out.print(a+ " | " +b+ " = " +c);

      }

      }
    

سنحصل على النتيجة التالية عند التشغيل.

      10 | 75 = 75
    

 هنا قمنا بتعليم الـ bits المشتركة و الغير مشتركة و التي تم جمعها باللون الاصفر.

a = 10; &nbsp &nbsp&nbsp // 10 = 00000000000000000000000000001010
b = 75; &nbsp &nbsp&nbsp // 75 = 00000000000000000000000001001011

c = a | b; &nbsp //&nbsp c = 00000000000000000000000001001011
&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp&nbsp //&nbsp c = 75


جافا العامل ^ (Bitwize XOR)

العامل ^ يحسب ناتج جمع الـ bits الغير مشتركة بين قيمتين.

مثال العامل ^ (Bitwize XOR)

Main.java
      public class Main {

      public static void main(String[] args) {

      int a = 10;      // 10 = 00000000000000000000000000001010
      int b = 75;      // 75 = 00000000000000000000000001001011

      int c = a ^ b;   // شرحنا كيف سيتم الحصول على الناتج تحت نتيجة التشغيل

      System.out.print(a+ " ^ " +b+ " = " +c);

      }

      }
    

سنحصل على النتيجة التالية عند التشغيل.

      10 ^ 75 = 65
    

 هنا قمنا بتعليم الـ bits الغير مشتركة و التي تم جمعها باللون الاصفر.

a = 10; &nbsp &nbsp&nbsp // 10 = 00000000000000000000000000001010
b = 75; &nbsp &nbsp&nbsp // 75 = 00000000000000000000000001001011

c = a | b; &nbsp //&nbsp c = 00000000000000000000000001000001
&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp&nbsp //&nbsp c = 65


جافا العامل ~ (Bitwize Compliment OR)

العامل ~ يقلب الـ bits التي تساوي 0 إلى 1 و يقلب الـ bits التي تساوي 1 إلى 0.
بعدها يتم حساب الناتج باتباع مبدأ single precision floating point number.

مثال العامل ~ (Bitwize Compliment OR)

Main.java
      public class Main {

      public static void main(String[] args) {

      int a = 10;     // 10 = 00000000000000000000000000001010
      int c = ~a;     //  c = 11111111111111111111111111110111 = -11

      System.out.print("~" +a+ " = " +c);

      }

      }
    

سنحصل على النتيجة التالية عند التشغيل.

      ~10 = -11
    


جافا العامل << (Left Shift)

العامل << يمسح bits من ناحية اليسار ثم يبدل كل bit تم مسحها منهم بصفر و يضعهم من ناحية اليمين.

مثال العامل << (Left Shift)

Main.java
      public class Main {

      public static void main(String[] args) {

      int a = 10;       // 10 = 00000000000000000000000000001010
      int c = a << 2;   // شرحنا كيف سيتم الحصول على الناتج تحت نتيجة التشغيل

      System.out.print(a+ " << 2 = " +c);

      }

      }
    

سنحصل على النتيجة التالية عند التشغيل.

      10 << 2 = 40
    

 هنا قمنا بتعليم الـ bits التي تم مسحها باللون الاصفر و تعليم الـ bits التي تم إضافتها باللون الأزرق.

a = 10; &nbsp &nbsp &nbsp // 10 = 00000000000000000000000000001010

c = a << 2; &nbsp //&nbsp c = 00000000000000000000000000101000 = 40
&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp //&nbsp c = 40


جافا العامل >> (Right Shift)

العامل >> عندها حالتين: قد يكون العدد أكبر من صفر أو أصغر من صفر.

  • إذا كان العدد أكبر من صفر, يمسح bits من ناحية اليمين ثم يبدل كل bit منهم بصفر و يضعهم من ناحية اليسار.

  • إذا كان العدد أصغر من صفر, يمسح bits من ناحية اليمين ثم يبدل كل bit منهم بواحد ليحافظ على إشارة الناقص و يضعهم من ناحية اليسار.


المثال الأول

الحالة الأولى: إذا كان العدد أكبر من صفر.

Main.java
      public class Main {

      public static void main(String[] args) {

      int a = 9;        // 9 = 00000000000000000000000000001001
      int c = a >> 2;   // شرحنا كيف سيتم الحصول على الناتج تحت نتيجة التشغيل

      System.out.print(a+ " >> 2 = " +c);

      }

      }
    

سنحصل على النتيجة التالية عند التشغيل.

9 >> 2 = 2

 هنا قمنا بتعليم الـ bits التي تم مسحها باللون الاصفر و تعليم الـ bits التي تم إضافتها باللون الأزرق.

a = 9; &nbsp &nbsp &nbsp&nbsp // 9 = 00000000000000000000000000001001

c = a >> 2; &nbsp // c = 00000000000000000000000000000010
&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp // c = 2

المثال الثاني

الحالة الثانية: إذا كان العدد أصغر من صفر.

Main.java
      public class Main {

      public static void main(String[] args) {

      // Note " >> " converts the number in 32 bits form

      int a = -9;       // -9 = 11111111111111111111111111111000
      int c = a >> 2;   // شرحنا كيف سيتم الحصول على الناتج تحت نتيجة التشغيل

      System.out.print(a+ " >> 2 = " +c);

      }

      }
    

سنحصل على النتيجة التالية عند التشغيل.

      -9 >> 2 = -3
    

 هنا قمنا بتعليم الـ bits التي تم مسحها باللون الاصفر و تعليم الـ bits التي تم إضافتها باللون الأزرق.

a = -9; &nbsp &nbsp &nbsp // -9 = 11111111111111111111111111110111

c = a >> 2; &nbsp //&nbsp c = 11111111111111111111111111111101
&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp //&nbsp c = -3


جافا العامل >>> (Zero Fill Right Shift)

العامل >>> يمسح bits من ناحية اليمين ثم يبدل كل bit منهم بصفر و يضعهم من ناحية اليسار.

مثال العامل >>> (Zero Fill Right Shift)

Main.java
      public class Main {

      public static void main(String[] args) {

      int a = 10;        // 10 = 00000000000000000000000000001010
      int c = a >>> 2;   //  c = 00000000000000000000000000000010 = 2

      System.out.print(a+ " >>> 2 = " +c);

      }

      }
    

سنحصل على النتيجة التالية عند التشغيل.

      10 >>> 2 = 2
    

ما هو الفرق بين العامل >>> و العامل >>؟

الفرق بينهما هو أن العامل >>> يحول دائماً آخر bit في العدد إلى 0 و هذا سيجعل الناتج دائماً رقم أكبر أو يساوي 0.