لنتحدث عن العمليات في Java: رقمية ومنطقية وبتية. هذا هو الأساس النظري الذي نحتاجه بالتأكيد لتعلم كيفية البرمجة.
الجدول 1. العوامل الحسابية الثنائية
لا ينبغي للمشغلين الأربعة الأوائل أن يثيروا أي أسئلة: كل شيء هو نفسه كما هو الحال في الرياضيات. العامل الأخير، أي ما تبقى من عملية القسمة، لا يقوم أيضًا بأي شيء معقد للغاية. على سبيل المثال، إذا قسمنا 24 على 7، نحصل على 3 أرقام صحيحة و3 أرقام متبقية. والباقي هو الذي سيعيده هذا العامل:
بالإضافة إلى العوامل الثنائية، لدى Java عوامل حسابية أحادية.
الجدول 2. العوامل الحسابية الأحادية:
مثال على الجمع الأحادي والناقص:
عمليات الزيادة والإنقاص بسيطة في الأساس. في الحالة الأولى يتم زيادة المتغير بمقدار 1، وفي الحالة الثانية يتم تقليل المتغير بمقدار 1. والمثال أدناه:
الجدول 3. عوامل الزيادة والنقصان:
توضيح:
بالإضافة إلى الحساب، هناك عمليات المقارنة (رقمين). ستكون النتيجة دائمًا صحيحة أو خاطئة ( صحيح / خطأ ).
الجدول 4. عوامل المقارنة
أمثلة:
الجدول 5. جدول الحقيقة لمشغل النفي (NOT)
الجدول 6. جدول الحقيقة لمشغل الاقتران (AND)
الجدول 7. جدول الحقيقة لمشغل الانفصال (OR)
الجدول 8. جدول الحقيقة لمشغل إضافة الوحدة (XOR)
لدى Java نفس العمليات المنطقية:
وإلى
الآن، لدينا عوامل الاختزال (
في بعض الأحيان يمكن حساب نتيجة التعبير من المعامل الأول. وهذا ما يميز العوامل المختصرة
في حالة عوامل الاختزال، لا يتم تقييم الجزء الثاني من التعبير. ولكن هذا يحدث فقط عندما تكون نتيجة التعبير واضحة بالفعل من المعامل الأول.
دعونا نوضح العد من 0 إلى 15 بالنظام العشري والثنائي:
كما ترون، كل شيء ليس معقدا للغاية. بالإضافة إلى البتات، هناك وحدات مألوفة أخرى من المعلومات - البايت ، والكيلو بايت ، والميجابايت ، والجيجابايت ، وما إلى ذلك. ربما تعلم أن هناك 8 بتات في البايت الواحد . ماذا يعني ذلك؟ وهذا يعني أن 8 بتات متتالية تشغل بايت واحد. فيما يلي أمثلة لما يمكن أن تكون عليه وحدات البايت:
فويلا - الأمر ليس بهذا التعقيد. ولكن لا يزال هناك شيء يحتاج إلى توضيح.
دعونا نلقي نظرة على هذا باستخدام رقم 8 بت كمثال:
النهج بسيط ومفهوم من حيث المبدأ. ومع ذلك، فإن لها عيوب: صعوبات في إجراء العمليات الحسابية. على سبيل المثال، مع إضافة أرقام سلبية وإيجابية. لا يمكن طيها إلا إذا تم إجراء معالجات إضافية.
في السطر الأول حصلنا على القيمة في نظام الأرقام الثنائية دون الأصفار البادئة. رغم أننا لا نراهم، إلا أنهم موجودون. يتضح هذا من خلال السطر الثاني، الذي تم فيه تحويل جميع البتات إلى بتات عكسية. ولهذا السبب نرى الكثير من الوحدات الرائدة. هذه هي الأصفار البادئة السابقة التي تم تجاهلها بواسطة المترجم عند طباعتها على السطر الأول. إليك برنامج صغير يعرض أيضًا الأصفار البادئة للوضوح.
الآن. ماذا يمكنك أن تقول عن الأعداد التي انتقلت إلى اليمين؟ وهي قابلة للقسمة على 2. في كل مرة نقوم فيها بإزاحة بت واحد إلى اليمين، نقسم الرقم الأصلي على 2. إذا كان الرقم غير قابل للقسمة على 2، فسيتم تقريب النتيجة نحو سالب ما لا نهاية (لأسفل). لكن هذا لا ينجح إلا إذا قمنا بتحويل البتات بمقدار 1 بالضبط. وإذا قمنا بإزاحة البتات بمقدار 1 بت، نقسم على 4. وعلى 3 بتات، نقسم على 8. وعلى 4 بتات، نقسم على 16. أرأيت؟ قوى 2... عندما نقوم بنقل رقم
- ما هي أنواع العوامل في جافا؟
- مشغلي جافا في دورة JavaRush
- عمليات الأرقام في جافا
- العمليات المنطقية في جافا
- عمليات Bitwise في Java
- أسبقية العمليات في جافا
- أمثلة مفيدة للاستخدام
ما هي أنواع العوامل في جافا؟
لأي عملية نحتاج إلى شيئين على الأقل:- المشغل أو العامل؛
- المعامل.
مشغلي جافا في دورة JavaRush
تم تخصيص عدة محاضرات لمشغلي Java في المستوى الرابع من المهمة الأولى - Java Syntax. على وجه الخصوص، عوامل التشغيل الشرطية مثل boolean . تحتوي الدورة على 22 مهمة ستساعدك على فهم عمل عوامل المقارنة، والعوامل الشرطية، والعوامل المنطقية.عمليات الأرقام في جافا
العملية الأكثر شيوعًا التي يقوم بها المبرمجون على الأرقام هي تعيين قيمة رقمية لمتغير. هي، مثل المشغل،=
مألوفة لك:
int a = 1;
int b = 2;
int c = 3;
هناك أيضًا عمليات حسابية. يتم تنفيذها باستخدام عوامل حسابية ثنائية:
System.out.println(24 % 7); // prints 3
فيما يلي أمثلة من موقع توثيق أوراكل الرسمي: سيخرج هذا البرنامج ما يلي: 1 + 2 = 3 3 - 1 = 2 2 * 2 = 4 4 / 2 = 2 2 + 8 = 10 10 % 7 = 3 تسمح لك Java للجمع: على سبيل المثال، تعيينات العوامل والعوامل الحسابية. لنلقي نظرة على مثال:
int x = 0;
x = x + 1; // x = 0 + 1 => x = 1
x = x + 1; // x = 1 + 1 => x = 2
x = x + 1; // x = 2 + 1 => x = 3
لقد قمنا هنا بتعريف متغير x
وتخصيصه بقيمة صفر. بعد ذلك، في كل سطر نقوم بتعيين قيمة x
لمجموع القيمة الحالية للمتغير x
وواحد. هناك توضيحات في التعليقات لكل سطر. يسمى هذا الإجراء زيادة أو زيادة المتغير. يمكن استبدال العملية المتزايدة من المثال أعلاه بعملية مماثلة باستخدام مجموعة من العوامل:
int x = 0;
x += 1; // x = 0 + 1 => x = 1
x += 1; // x = 1 + 1 => x = 2
x += 1; // x = 2 + 1 => x = 3
يمكنك دمج عامل الإسناد مع أي عامل حسابي:
int x = 0;
x += 10; // x = 0 + 10 => x = 10
x -= 5; // x = 10 - 5 => x = 5
x *= 5; // x = 5 * 5 => x = 25
x /= 5; // x = 25 / 5 => x = 5
x %= 3; // x = 5 % 3 => x = 2;
دعونا نوضح كيفية عمل المثال الأخير:
int x = 0;
x = (+5) + (+15); // Parentheses for clarity, it is possible without them
System.out.println("x = " + x);
int y = -x;
System.out.println("y = " + y);
int x = 9;
x++;
System.out.println(x); // 10
int y = 21;
y--;
System.out.println(y); // 20
هناك نوعان من هذه العمليات - اللاحقة والبادئة. في الحالة الأولى، يتم كتابة العامل بعد المتغير، وفي الحالة الثانية، قبل المتغير. والفرق الوحيد هو عند تنفيذ عملية الزيادة أو التخفيض. المثال والوصف في الجدول أدناه. لنفترض أن لدينا متغير:
int a = 2;
ثم:
int a = 1;
int b = 2;
boolean comparisonResult = a == b;
System.out.println("a == b :" + comparisonResult);
comparisonResult = a != b;
System.out.println("a != b :" + comparisonResult);
comparisonResult = a > b;
System.out.println("a > b :" + comparisonResult);
comparisonResult = a >= b;
System.out.println("a >= b :" + comparisonResult);
comparisonResult = a < b;
System.out.println("a < b :" + comparisonResult);
comparisonResult = a <= b;
System.out.println("a <= b :" + comparisonResult);
توضيح:
العمليات المنطقية في جافا
دعونا نلقي نظرة على العمليات المنطقية وجداول الحقيقة لكل منها:- عملية النفي (
NOT
); - عملية الاقتران المنطقية AND (
AND
); - عملية الفصل المنطقية OR (
OR
); - عملية إضافة modulo، حصرية OR (
XOR
).
!
- مشغل النفي؛&&
- عامل تشغيل منطقي AND (قصير)؛||
- عامل التشغيل المنطقي OR (قصير)؛&
- عامل التشغيل AND؛|
- معامل البت OR؛^
- مشغل OR الحصري للبت.
public class LogicDemo {
public static void main(String[] args) {
notExample();
andExample();
orExample();
xorExample();
}
public static void notExample() {
System.out.println("NOT EXAMPLE:");
System.out.println("NOT false = " + !false);
System.out.println("NOT true = " + !true);
System.out.println();
}
public static void andExample() {
System.out.println("AND EXAMPLE:");
System.out.println("false AND false = " + (false & false));
System.out.println("false AND true = " + (false & true));
System.out.println("true AND false = " + (true & false));
System.out.println("true AND true = " + (true & true));
System.out.println();
}
public static void orExample() {
System.out.println("OR EXAMPLE:");
System.out.println("false OR false = " + (false | false));
System.out.println("false OR true = " + (false | true));
System.out.println("true OR false = " + (true | false));
System.out.println("true OR true = " + (true | true));
System.out.println();
}
public static void xorExample() {
System.out.println("XOR EXAMPLE:");
System.out.println("false XOR false = " + (false ^ false));
System.out.println("false XOR true = " + (false ^ true));
System.out.println("true XOR false = " + (true ^ false));
System.out.println("true XOR true = " + (true ^ true));
System.out.println();
}
}
سيعرض هذا البرنامج: ليس مثال: NOT false = true NOT true = false ومثال: false و false = false false و true = false true و false = false true و true = true أو مثال: false OR false = false false OR true = true true OR false = true true OR true = true XOR مثال: false XOR false = false false XOR true = true true XOR false = true true XOR true = false تنطبق العوامل المنطقية على boolean
المتغيرات فقط. في حالتنا، قمنا بتطبيقها مباشرة على القيم، ولكن يمكنك أيضًا استخدامها مع boolean
المتغيرات:
boolean
العبارات:
&&
، ||
) وعوامل تشغيل البت المماثلة ( &
، |
). ما الفرق بينهم؟ أولاً، يمكن تطبيق bitwise على الأعداد الصحيحة. سنتحدث عن هذا بعد قليل. وثانيا، بعضها مختصر والبعض الآخر ليس كذلك. لفهم كيف يبدو الاختصار، دعونا نلقي نظرة على التعبير:
false AND x = ?
true OR x = ?
يمكن أن يستغرق هذا x
أي قيمة منطقية. وبشكل عام، ووفقاً لقوانين المنطق وجداول الحقيقة، بغض النظر عما إذا كان x
صحيحاً أم خطأ ، فإن نتيجة التعبير الأول ستكون خاطئة ، ونتيجة الثاني ستكون صحيحة . ينظر.
&&
و ||
. في التعبيرات المشابهة لتلك الموصوفة أعلاه، فإنها لا تقوم بتقييم قيمة المعامل الثاني. إليك مثال صغير:
عمليات Bitwise في Java
حسنًا، نأتي هنا إلى الجزء الأكثر إثارة للاهتمام: العمليات المتعلقة بالبت. كما يوحي الاسم، هذه هي العمليات التي يتم تنفيذها على البتات. ولكن قبل أن نتعمق في هذا الموضوع، يجدر الحديث عن المجالات ذات الصلة.تمثيل الأرقام في نظام الأرقام الثنائية
يتم تخزين الأرقام، مثل أي معلومات أخرى في البرنامج، في ذاكرة الكمبيوتر في رمز ثنائي. الرمز الثنائي عبارة عن مجموعة من الأصفار والواحدات. يمثل كل صفر أو واحد وحدة معلومات تسمى البت.بحسب ويكيبيديا:
قليلا (من الرقم الثنائي الإنجليزي - الرقم الثنائي؛ أيضا اللعب على الكلمات: الإنجليزية بت - قطعة، جسيم) هي وحدة قياس كمية المعلومات. 1 بت من المعلومات هو رمز أو إشارة يمكن أن تأخذ معنيين: تشغيل أو إيقاف، نعم أو لا، مرتفع أو منخفض، مشحون أو غير مشحون؛ في النظام الثنائي يكون 1 (واحد) أو 0 (صفر).ما نوع البيانات التي يعمل بها مشغلو bitwise؟
يتم تنفيذ عمليات Bitwise في Java على الأعداد الصحيحة فقط. يتم تخزين الأعداد الصحيحة في ذاكرة الكمبيوتر كمجموعة من البتات. يمكننا القول أن الكمبيوتر يحول أي معلومات إلى نظام أرقام ثنائي (مجموعة من البتات) وعندها فقط يتفاعل معها. ولكن كيف يعمل نظام الأرقام الثنائية؟ في نظام الأرقام العشري لدينا 10 رموز فقط: 0، 1، 2، 3، 4، 5، 6، 7، 8، 9. نستخدم هذه الرموز للعد. بعد 9 يأتي 10، بعد 19 - 20، بعد 99 - 100، بعد 749 - 750. أي أننا نستخدم مجموعة من الرموز العشرة المتاحة ويمكننا استخدامها للعد "من الصفر إلى الغداء". في نظام الأرقام الثنائية، بدلا من عشرة رموز، هناك رمزان فقط - 0، 1. ولكن من خلال الجمع بين هذه الرموز وفقا لنفس المبدأ كما هو الحال في النظام العشري، يمكننا العد إلى أجل غير مسمى.
00000000 - 1 byte
10110010 - 1 byte
01011011 - 1 byte
عدد مجموعات البتات غير المتكررة المحتملة في البايت الواحد هو 256 (2 8 = 256). ولكن دعونا نعود أقرب إلى جافا. يوجد نوع بيانات صحيح - byte
. يمكن لهذا النوع أن يأخذ القيم من -128 إلى 127 ويشغل الرقم الواحد في ذاكرة الكمبيوتر 8 بتات بالضبط، أو 1 بايت. رقم واحد من هذا النوع يشغل byte
ذاكرة كمبيوتر واحدة بالضبط. وهنا تتطابق الأسماء ليس بالصدفة. كما نتذكر، يمكن للبايت الواحد تخزين 256 قيمة مختلفة. byte
ويمكن أن يأخذ رقم النوع الواحد 256 قيمة مختلفة (128 سالبة، 127 موجبة و1 صفر). تحتوي كل قيمة رقمية byte
على مجموعة فريدة من ثماني بتات. هذا هو الحال ليس فقط مع النوع byte
، ولكن مع جميع الأنواع المتكاملة. ويرد النوع byte
كمثال كأصغر. يوضح الجدول أدناه جميع أنواع الأعداد الصحيحة في Java ومساحة الذاكرة التي تشغلها: خذ بعين الاعتبار النوع int
. يمكنه تخزين 2147483648 قيمة سالبة، 2147483647 قيمة موجبة، وصفر واحد. المجموع:
2147483648 + 2147483647 + 1 = 4294967296.
يشغل هذا النوع 32 بت من ذاكرة الكمبيوتر. عدد المجموعات الممكنة من مجموعة مكونة من 32 صفراً وواحداً هو:
232 = 4294967296.
نفس عدد القيم التي يمكن أن يحملها النوع int
. هذا مجرد توضيح للعلاقة بين نطاق قيم نوع البيانات وحجمه (عدد البتات في الذاكرة). يمكن تحويل أي رقم من أي نوع في Java إلى ثنائي. دعونا نرى مدى سهولة القيام بذلك باستخدام لغة جافا. سوف نتعلم من مثال النوع int
. هذا النوع له فئة المجمع الخاصة به - Integer
. ولديه واحدة toBinaryString
، والتي سوف تقوم بكل العمل بالنسبة لنا:
int
الرقم يأخذ 32 بت. ولكن عندما نطبع الرقم 10 في المثال أعلاه، نرى 1010 في وحدة التحكم، وذلك لأنه لا تتم طباعة الأصفار البادئة. إذا تم عرضها، فبدلاً من 1010 سنرى في وحدة التحكم 00000000000000000000001010. ولكن لسهولة الإدراك، تم حذف جميع الأصفار البادئة. ليس الأمر بهذه الصعوبة حتى تسأل نفسك: ماذا عن الأرقام السالبة؟ يتلقى المعلومات فقط في النظام الثنائي. اتضح أن علامة الطرح تحتاج أيضًا إلى الكتابة بالرمز الثنائي. يمكن القيام بذلك باستخدام التعليمات البرمجية المباشرة أو التكميلية.
الكود المباشر
طريقة لتمثيل الأرقام في نظام الأرقام الثنائية، حيث يتم تخصيص البت الأكثر أهمية (أقصى اليسار) لإشارة الرقم. إذا كان الرقم موجبًا، فسيتم كتابة البت الموجود في أقصى اليسار 0، وإذا كان سالبًا - 1.رمز إضافي
باستخدام تعليمات برمجية إضافية، يمكنك تجنب عيوب التعليمات البرمجية المباشرة. توجد خوارزمية بسيطة للحصول على الرمز الإضافي للرقم. دعنا نحاول الحصول على الرمز الإضافي للرقم -5. دعونا نمثل هذا الرقم باستخدام الكود المكمل لاثنين في نظام الأرقام الثنائية. الخطوة 1. نحصل على تمثيل لرقم سالب باستخدام الكود المباشر. بالنسبة إلى -5 سيكون 10000101. الخطوة 2. اعكس جميع الأرقام باستثناء رقم الإشارة. دعونا نستبدل جميع الأصفار بالآحاد، والواحدات بالأصفار في كل مكان باستثناء الجزء الموجود في أقصى اليسار.
10000101 => 11111010
الخطوة 3. أضف واحدًا إلى القيمة الناتجة:
11111010 + 1 = 11111011
مستعد. لقد حصلنا على قيمة -5 في نظام الأرقام الثنائية باستخدام الكود المكمل لاثنين. يعد هذا أمرًا مهمًا لفهم المواد التالية، نظرًا لأن Java تستخدم الكود المكمل ثنائي لتخزين الأرقام السالبة في وحدات البت.
أنواع العمليات bitwise
الآن بعد أن تعاملنا مع جميع المقدمات، دعونا نتحدث عن عمليات البت في Java. يتم تنفيذ عملية bitwise على الأعداد الصحيحة وتكون نتيجتها عددًا صحيحًا. في هذه العملية، يتم تحويل الرقم إلى ثنائي، ويتم تنفيذ عملية على كل بت، ويتم تحويل النتيجة مرة أخرى إلى رقم عشري. قائمة العمليات موجودة في الجدول أدناه: كما اكتشفنا بالفعل، يمكن تمثيل الأرقام كمجموعة من البتات. تقوم عمليات Bitwise بإجراء عمليات على كل بت من هذا التمثيل بالضبط. لنأخذNOT
، AND
، OR
، XOR
. تذكر أننا نظرنا مؤخرًا إلى جداول الحقيقة بحثًا عن المعاملات المنطقية فقط. في هذه الحالة، يتم تطبيق نفس العمليات على كل بت من العدد الصحيح.
المشغل الأحادي للبت NOT ~
يستبدل هذا العامل جميع الأصفار بواحد، وكل الآحاد بأصفار. لنفترض أن لدينا الرقم 10 بالتدوين العشري. في النظام الثنائي، هذا الرقم هو 1010. إذا طبقنا عامل النفي الأحادي للبت على هذا الرقم، فسنحصل على شيء مثل هذا: دعونا نلقي نظرة على ما يبدو عليه في كود Java:public static void main(String[] args) {
int a = 10;
System.out.println(" a = " + a + "; binary string: " + Integer.toBinaryString(a));
System.out.println("~a = " + ~a + "; binary string: " + Integer.toBinaryString(~a));
}
الآن دعونا نرى ما يتم عرضه في وحدة التحكم:
عامل التشغيل AND
ينطبق هذا العامل على رقمين. ينفذ عمليةAND
بين بتات كل رقم. دعونا نلقي نظرة على مثال: يتم تنفيذ هذه العملية على رقمين. مثال في كود جافا:
مشغل Bitwise OR
أو ينطبق على رقمين. ينفذ عملية OR بين بتات كل رقم: الآن دعونا نلقي نظرة على الشكل الذي سيبدو عليه هذا في IDEA:عملية ثنائية، حصرية OR (XOR)
دعونا ننظر إلى نفس المثال، ولكن مع عملية جديدة: رمز المثال:إزاحة اتجاه البت إلى اليسار
ينطبق هذا العامل على معاملين، أي أنه في العملية ، ستغيرx << y
بتات الرقم مواضعها إلى اليسار. ماذا يعني ذلك؟ لننظر إلى مثال العملية، نتيجة العملية ستكون الرقم 20 في النظام العشري. كما ترون من الرسم البياني أعلاه، يتم إزاحة جميع البتات إلى اليسار بمقدار 1. أثناء هذه العملية، يتم فقدان قيمة البت الأكثر أهمية (البت الموجود في أقصى اليسار). والبت الأقل أهمية (البت الموجود في أقصى اليمين) يتم ملؤه بالصفر. ماذا يمكنك أن تقول عن هذه العملية؟ x
y
10 << 1
-
من خلال نقل بتات الرقم
X
إلىN
اليسار، نضرب الرقمX
بـ 2 N .هنا مثال:
-
لكن! قد تتغير إشارة الرقم إذا اتخذت البتة ذات القيمة 1 الموضع في أقصى اليسار.
-
إذا قمت بالانتقال إلى اليسار إلى أجل غير مسمى، فسيتحول الرقم ببساطة إلى 0. دعنا نوضح النقطتين 2 و3:
تحويل اتجاه البت إلى اليمين
ينطبق هذا العامل على معاملين. أولئك. في هذه العمليةx >> y
، سوف تقوم بتات الرقم x
بتغيير y
مواضعها إلى اليمين. دعونا ننظر إلى مثال آخر. دعونا نحلل العملية بشكل تخطيطي 10 >> 1
. دعونا ننقل جميع البتات الخاصة بالرقم 10 إلى موضع واحد إلى اليمين: أثناء عملية النقل، نفقد البتات الصحيحة. إنهم ببساطة يختفون. البت الموجود في أقصى اليسار هو علامة الرقم (0 موجب، 1 سالب). لذلك، يتم وضعه في القيمة النهائية كما هو الحال في الرقم الأصلي. مثال مع رقم سالب: يتم فقدان البت الموجود في أقصى اليمين، ويتم نسخ البت الموجود في أقصى اليسار من الرقم الأصلي، كعلامة فخرية للرقم. كيف تفعل كل هذا في IDEA؟ من حيث المبدأ، لا يوجد شيء معقد، فقط خذها وحركها:
X
إلى N
اليمين بالبتات، فإننا نقسم الرقم X
على 2 أس 2 N
. توضيح:
public class BitOperationsDemo {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
int shiftOperationResult = 2048 >> i;
int devideOperationResult = 2048 / (int) Math.pow(2, i);
System.out.println(shiftOperationResult + " - " + devideOperationResult);
}
}
}
ما الذي يحدث هنا؟
-
حلقة يتم فيها زيادة المتغير i من 1 إلى 10.
- في كل تكرار نحسب قيمتين:
-
نكتب في المتغير
shiftOperationResult
نتيجة نقل الرقم 2048 بمقدار i بت إلى اليمين؛ -
devideOperationResult
نكتب نتيجة قسمة الرقم 2048 على 2 للقوة i إلى متغير . -
نعرض القيمتين اللتين تم الحصول عليهما في أزواج.
GO TO FULL VERSION