ماهي العوامل التي تستخدم للتعامل مع الـ 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)
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 المشتركة و التي تم جمعها باللون الاصفر.
b = 75;      // 75 = 00000000000000000000000001001011
c = a & b;   //  c = 00000000000000000000000000001010
             //  c = 10
جافا العامل | (Bitwize OR)
العامل | يحسب ناتج جمع الـ bits المشتركة و الغير مشتركة بين قيمتين.
مثال العامل | (Bitwize OR)
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 المشتركة و الغير مشتركة و التي تم جمعها باللون الاصفر.
b = 75;      // 75 = 00000000000000000000000001001011
c = a | b;   //  c = 00000000000000000000000001001011
             //  c = 75
جافا العامل ^ (Bitwize XOR)
العامل ^ يحسب ناتج جمع الـ bits الغير مشتركة بين قيمتين.
مثال العامل ^ (Bitwize XOR)
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 الغير مشتركة و التي تم جمعها باللون الاصفر.
b = 75;      // 75 = 00000000000000000000000001001011
c = a | b;   //  c = 00000000000000000000000001000001
             //  c = 65
جافا العامل ~ (Bitwize Compliment OR)
العامل ~ يقلب الـ bits التي تساوي 0 إلى 1 و يقلب الـ bits التي تساوي 1 إلى 0.
بعدها يتم حساب الناتج باتباع مبدأ single precision floating point number.
مثال العامل ~ (Bitwize Compliment OR)
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)
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 التي تم إضافتها باللون الأزرق.
c = a << 2;   //  c = 00000000000000000000000000101000 = 40
              //  c = 40
جافا العامل >> (Right Shift)
العامل >> عندها حالتين: قد يكون العدد أكبر من صفر أو أصغر من صفر.
إذا كان العدد أكبر من صفر, يمسح bits من ناحية اليمين ثم يبدل كل bit منهم بصفر و يضعهم من ناحية اليسار.
إذا كان العدد أصغر من صفر, يمسح bits من ناحية اليمين ثم يبدل كل bit منهم بواحد ليحافظ على إشارة الناقص و يضعهم من ناحية اليسار.
•الحالة الأولى: إذا كان العدد أكبر من صفر.
public class Main {
public static void main(String[] args) {
int a = 9; // 9 = 00000000000000000000000000001001
int c = a >> 2; // شرحنا كيف سيتم الحصول على الناتج تحت نتيجة التشغيل
System.out.print(a+ " >> 2 = " +c);
}
}
•سنحصل على النتيجة التالية عند التشغيل.
• هنا قمنا بتعليم الـ bits التي تم مسحها باللون الاصفر و تعليم الـ bits التي تم إضافتها باللون الأزرق.
c = a >> 2;   // c = 00000000000000000000000000000010
              // c = 2
•الحالة الثانية: إذا كان العدد أصغر من صفر.
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 التي تم إضافتها باللون الأزرق.
c = a >> 2;   //  c = 11111111111111111111111111111101
              //  c = -3
جافا العامل >>> (Zero Fill Right Shift)
العامل >>> يمسح bits من ناحية اليمين ثم يبدل كل bit منهم بصفر و يضعهم من ناحية اليسار.
مثال العامل >>> (Zero Fill Right Shift)
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.