- العوامل المنطقية في جافا
- عامل النفي المنطقي!
- منطقية AND - &، وكذلك مشروطة AND - &&
- المنطقي OR هو عامل التشغيل |، وكذلك الشرطي OR هو عامل التشغيل ||
- XOR - منطقي حصري OR - عامل التشغيل ^
- أولوية العمليات المنطقية
- التعابير المنطقية المعقدة
- عوامل تشغيل Bitwise (bitwise).
- عوامل تشغيل Bitwise &، | و ^
- رمز إضافي
- عامل النفي bitwise ~
العمليات المنطقية في جافا
يتم تنفيذ العمليات المنطقية باستخدام عوامل التشغيل المنطقية. عذرا على الحشو، ولكن هذا هو بالضبط ما هي الأمور. يمكن تطبيق العمليات المنطقية الأساسية (في البرمجة والرياضيات) على الوسائط المنطقية (المعاملات)، ويمكن استخدامها أيضًا لتكوين تعبيرات أكثر تعقيدًا، على غرار العمليات الحسابية على الأرقام. على سبيل المثال التعبير:
(a | b) | (c < 100) & !(true) ^ (q == 5)
هو تعبير منطقي معقد يحتوي على أربعة معاملات: (a | b)
، وحيث а
، b
ومتغيرات النوع boolean
(c < 100)
(true)
(q == 5)
، وفي المقابل، يتكون التعبير المنطقي البسيط (a | b)
أيضًا من وسيطتين للمعامل. المعامل المنطقي هو التعبير الذي يمكن أن يقال أنه صحيح أو خطأ، صحيح أو خطأ . في لغة Java، المعامل المنطقي هو تعبير عن نوع boolean
أو منطقي، على سبيل المثال:
(2 < 1)
— المعامل المنطقي، قيمته خاطئةtrue
- معامل منطقي تكون قيمته صحيحة بشكل واضحboolean a
- يمكن أن يكون أيضًا معاملًا منطقيًا، مثل Boolean aint a = 2
- ليس معاملًا منطقيًا ، بل هو مجرد متغير من النوعint
String a = "true"
هو أيضا ليس معاملا منطقيا . هذه سلسلة قيمتها النصية هي"true"
.
- النفي المنطقي ، المعروف أيضًا
NOT
باسم الانقلاب. في Java، تتم الإشارة إليه بالرمز "!
" قبل المعامل. ينطبق على معامل واحد. - منطقي و ، بل هو أيضا
AND
بالتزامن. يشار إليه بالرمز "&
" بين المعاملين اللذين يتم تطبيقه عليهما. - منطقي أو في Java ، فهو أيضًا -
OR
وهو أيضًا انفصال. في Java، يُشار إليه بالرمز "|
" بين مُعاملين. - حصريًا أو انفصالًا
XOR
صارمًا. في Java، يُشار إليه بالرمز "^
" بين مُعاملين. - في Java، تتضمن العوامل المنطقية الشرطية أو ، المشار إليها بـ
||
، بالإضافة إلى الشرطية و -&&
.
==
ومع ذلك، في Java، لا يعتبر عامل المساواةانتباه! في Java، تنطبقالعوامل المنطقية&
أيضًاعلى الأعداد الصحيحة. في هذه الحالة، تعمل بشكل مختلف قليلاً وتسمى عوامل التشغيل المنطقية ذات اتجاه البت (أو عامل البت). عنهم - في نهاية المقال. دعونا نلقي نظرة على جدول يحتوي على وصف موجز لكل عامل من عوامل تشغيل Java المنطقية، وفيما يلي سنصفها بمزيد من التفصيل ونقدم أمثلة التعليمات البرمجية. |
^
مشغل جافا | اسم | يكتب | وصف قصير | مثال |
---|---|---|---|---|
! |
"لا" منطقية (النفي) | أحادي | !x تعني "ليس x". إرجاع صحيح إذا كان المعامل خطأ . إرجاع false إذا كان المعامل صحيحًا . |
boolean x = true; ثم // !x == false |
& |
منطقية AND ( AND ، الضرب) |
الثنائية | يُرجع صحيحًا إذا كان كلا المعاملين صحيحين . | a = true; b = false; ثم a & b == false |
| |
منطقية أو ( OR ، إضافة) |
الثنائية | يُرجع صحيحًا إذا كان أحد المعاملات على الأقل صحيحًا . | a = true; b = false; ثم a | b == true |
^ |
منطقية حصرية أو ( XOR ) |
الثنائية | يُعاد صحيحًا إذا كان أحد المعاملات صحيحًا . إرجاع false إذا كان كلا المعاملين صحيحًا أو خطأ . بشكل أساسي، فإنه يُرجع صحيحًا إذا كانت المعاملات مختلفة. | a = true; b = false; ثم a ^ b == true |
&& |
شرطي AND (منطقي قصير AND) | الثنائية | تمامًا مثل ، ولكن إذا كان& المعامل الموجود على يساره & خطأ ، فسيُرجع هذا العامل خطأ دون التحقق من المعامل الثاني. |
|
|| |
شرطي OR (منطقي قصير OR) | الثنائية | تمامًا مثل، | ولكن إذا كان العامل الموجود على اليسار صحيحًا ، فسيرجع العامل صحيحًا دون التحقق من المعامل الثاني. |
عامل النفي المنطقي!
هذا العامل أحادي، مما يعني أنه ينطبق على تعبير أو معامل منطقي واحد. من السهل جدًا فهمه، مثل أي نفي: يقوم العامل ببساطة بتغيير معنى التعبير إلى نقيضه. جدول الحقيقة أو نتائج إجراء عملية النفي:قيمة أ | !أ |
خطأ شنيع | حقيقي |
حقيقي | خطأ شنيع |
public class Solution {
public static void main(String[] args) {
boolean a = true;
System.out.println(!a); // here our boolean expression reverses its value
System.out.println(!false); // non-false expression, as you might guess, will be equal to... what?
System.out.println(!(2 < 5)); // expression (2 < 5) is true, so its negation is false
}
}
مخرجات البرنامج ستكون على النحو التالي:
false
true
false
منطقية AND - &، وكذلك مشروطة AND - &&
يتم تطبيق AND أو الاقتران المنطقي على تعبيرين، ولن تكون نتيجته صحيحة إلا إذا كان كلا المعاملين صحيحين. أي أنه إذا كان أحد المعاملاتa
أو خطأ ، فسيكون التعبير خطأ بغض النظر عن قيمة العامل الثاني. إذا تخيلت أن صحيح هو الرقم 1 وأن خطأ هو 0، فإن عامل التشغيل يعمل تمامًا مثل الضرب العادي. لذلك، يُطلق على عملية AND المنطقية غالبًا اسم "الضرب المنطقي". وبالمناسبة، هذه الحقيقة تساعد على تذكر عمل المشغل بسرعة وعدم الخلط بينه وبين العامل المنطقي أو . جدول الحقيقة AND، وهو أيضًا نتيجة عمل المشغلb
a & b
&
&
|
&
أ | ب | أ & ب |
حقيقي | حقيقي | حقيقي |
حقيقي | خطأ شنيع | خطأ شنيع |
خطأ شنيع | حقيقي | خطأ شنيع |
خطأ شنيع | خطأ شنيع | خطأ شنيع |
public class Solution {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
boolean c = true;
System.out.println(a & b); // if we multiply true by false, we will definitely get false
System.out.println(a & c); // true to true will be true
System.out.println(false & (2 > 5));
System.out.println((2 < 5) & false);
// regardless of the truthfulness of the expression in brackets, in which case we have to be content with false
}
}
نتيجة البرنامج:
false
true
false
false
يُطلق على عامل التشغيل &&
أحيانًا اسم "Short AND". وتنتج نفس النتيجة عند العمل مع المعاملات المنطقية مثل عامل التشغيل &
. ومع ذلك، هناك اختلاف في عمله نفسه. لقد لاحظت بالفعل أنه إذا كانa & b
المعامل في التعبير () a
خاطئًا ، فليس من المنطقي التحقق من قيمة المعامل : ستكون نتيجة العملية خاطئة بالتأكيد . لذا، إذا لم نكن بحاجة بشكل أساسي إلى قيمة المعامل الثاني، فسنقوم باستخدامه بتقليل عدد العمليات الحسابية في البرنامج. إذا استبدلنا جميع العوامل في المثال بـ ، فستكون النتيجة هي نفسها تمامًا، لكن البرنامج نفسه سيعمل بشكل أسرع قليلاً (على الرغم من أننا لن نلاحظ ذلك، لأننا نتحدث عن mili-micro... باختصار ، وحدات زمنية صغيرة جدًا). b
&&
&
&&
المنطقي OR هو عامل التشغيل |، وكذلك الشرطي OR هو عامل التشغيل ||
يتم تمثيل عامل التشغيل OR في Java بالرمز|
. يتم تطبيق عملية OR المنطقية أو الانفصال على تعبيرين، وستكون نتيجتها خاطئة إذا كان كلا المعاملين خاطئين فقط. هنا نلاحظ إلى حد ما نفس الصورة كما في حالة المشغل &
، ولكن العكس تمامًا. أي أنه إذا كان معامل واحد على الأقل صحيحًاa | b
، فسيتم ضمان أن يكون التعبير صحيحًا بغض النظر عن قيمة العامل الثاني. إذا &
كان يتصرف مثل الضرب المنطقي، فإن OR هو جمع منطقي، إذا كنت تتخيل أن true هو 1 و false هو 0. فقط تذكر أن الجمع المنطقي يعمل بشكل مختلف عن الجمع العادي. 1 + 1 في هذه الحالة لا يساوي 2، بل 1 (الرقم 2 ببساطة غير موجود في هذا النظام). في بعض الأحيان يُفهم الانفصال على أنه الحد الأقصى 0 و1، وفي هذه الحالة، إذا كان مُعامل واحد على الأقل يساوي 1 ( صحيح )، فإننا نحصل على صحيح تمامًا . أو جدول الحقيقة، المعروف أيضًا بنتيجة العامل |
:
أ | ب | أ | ب |
حقيقي | حقيقي | حقيقي |
حقيقي | خطأ شنيع | حقيقي |
خطأ شنيع | حقيقي | حقيقي |
خطأ شنيع | خطأ شنيع | خطأ شنيع |
public class Solution {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
boolean c = true;
System.out.println(!a | b); // Compose the use of two logical operators: a == true, so !a, as we already know, is false.
System.out.println(a | c);
System.out.println((2 < 5) | false); // expression (2 < 5) is true, which means that for any second operand we get a true result
System.out.println((2 > 5) | true);
}
}
نتيجة:
false
true
true
true
إذا استخدمنا العامل الشرطي OR - ||
بدلاً من |
, فسنحصل على نفس النتيجة تمامًا، ولكن كما في حالة الشرط AND &&
، فإنه سيعمل بشكل اقتصادي: إذا "واجهنا" المعامل الأول يساوي true ، فإن قيمة لم يتم التحقق من المعامل الثاني، ولكن النتيجة صحيحة على الفور .
XOR Java - منطقي حصري OR - عامل التشغيل ^
XOR
، إضافة modulo 2، XOR المنطقي، الطرح المنطقي، الانفصال الدقيق، تكملة البت... العامل ^
له العديد من الأسماء في الجبر البوليني. ستكون نتيجة تطبيق هذا العامل على معاملين صحيحة إذا كانت المعاملات مختلفة وكاذبة إذا كانت المعاملات متماثلة. لذلك، من الملائم مقارنتها بطرح الأصفار ( خطأ ) والآحاد ( صحيح ). جدول الحقيقة XOR
، المعروف أيضًا باسم نتيجة العامل ^
:
منطقية أ | منطقية ب | أ ^ ب |
حقيقي | حقيقي | خطأ شنيع |
حقيقي | خطأ شنيع | حقيقي |
خطأ شنيع | حقيقي | حقيقي |
خطأ شنيع | خطأ شنيع | خطأ شنيع |
public class Solution {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
boolean c = true;
System.out.println(!a ^ b); // Compose the use of two logical operators: a == true, so !a, as we already know, is false.
System.out.println(a ^ c);
System.out.println((2 < 5) ^ false);
System.out.println((2 > 5) ^ true);
}
}
نتيجة:
false
false
true
true
أولوية العمليات المنطقية
كما هو الحال في الرياضيات، في البرمجة، يكون لدى المشغلين ترتيب محدد للتنفيذ عندما يظهرون في نفس التعبير. تتمتع العوامل الأحادية بمزايا مقارنة بالعمليات الثنائية، والضرب (حتى المنطقي) على الجمع. لقد صنفنا العوامل المنطقية في مرتبة أعلى في القائمة، وكلما زادت أولويتها:!
&
^
|
&&
||
&
و |
) أسبقية مختلفة:
public class Solution {
public static void main(String[] args) {
boolean a = true, b = true, c = false;
System.out.println(a | b & c);
}
إذا أردنا المتابعة من اليسار إلى اليمين، أي تطبيق عامل التشغيل أولاً |
ثم - &
، فسنحصل على القيمة false . لكن في الواقع، إذا قمت بتشغيل هذا البرنامج، فسوف تكون متأكدًا من أن الإخراج سيكون صحيحًا ، نظرًا لأن العامل المنطقي AND &
سيكون له أولوية أعلى من العامل المنطقي OR |
. لتجنب الارتباك، عليك أن تتذكر أن ما &
يتصرف مثل الضرب وما |
يتصرف مثل الجمع. يمكنك تغيير ترتيب الأولوية. فقط استخدم الأقواس، تمامًا كما هو الحال في الرياضيات المدرسية. دعونا نغير رمز المثال الخاص بنا قليلاً:
public class Solution {
public static void main(String[] args) {
boolean a = true, b = true, c = false;
System.out.println((a|b)&c);
}
ما أخبارك؟ أولا نستخدم الجمع المنطقي بين قوسين، ثم الضرب. وستكون النتيجة كاذبة .
التعابير المنطقية المعقدة
بالطبع، يمكننا الجمع بين التعبيرات المنطقية وعوامل التشغيل. لنتذكر التعبير من بداية المقال:(a | b) | (c < 100) & !(true) ^ (q == 5)
الآن لا يبدو الأمر مخيفًا جدًا. لنكتب برنامجًا يعرض قيمته، بعد أن حددنا مسبقًا قيم a
, b
و , с
و q
. مثال لحساب قيمة تعبير منطقي معقد
public class Solution {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
int c = 25;
int q = 2;
System.out.println((a|b) | (c < 100) & !(true)^(q == 5));
}
}
ملحوظة:متغيرنا من النوع ، لكن هذا تعبير منطقي، ويساوي falseq
، لأننا أعلاه قمنا بتهيئته بالرقم 2. وينطبق الشيء نفسه على المتغير . هذا الرقم يساوي 25، لكن (c < 100) هو تعبير منطقي يساوي true . نتيجة هذا البرنامج : int
q == 5
q
c
true
يمكن استخدام التعبيرات المنطقية المعقدة لاختبار شروط معقدة ومتفرعة للغاية، ولكن لا ينبغي الإفراط في استخدامها: فهي تجعل قراءة التعليمات البرمجية صعبة.
عوامل تشغيل Bitwise (bitwise).
في بداية المقال، ذكرنا أن العوامل يمكن&
استخدامها فيما يتعلق بأنواع الأعداد الصحيحة في Java. في هذه الحالة هم مشغلي bitwise. وتسمى أيضًا بالبت، نظرًا لأن الرقم الواحد هو بت واحد، وتعمل هذه العمليات بشكل خاص مع البتات. وبطبيعة الحال، فإنها تعمل بشكل مختلف إلى حد ما عن العوامل المنطقية، ولكي تفهم بالضبط كيف، عليك أن تعرف ما هو نظام الأرقام الثنائية. إذا كنت لا تعرف شيئًا عنها أو نسيتها تمامًا، نقترح عليك أولاً قراءة المقالة Java: bits and bytes وتذكير الجميع أنه في نظام الأرقام الثنائية يوجد رقمان فقط - 0 و1، وجميع البيانات في الكمبيوتر يتم تمثيلها بدقة باستخدام الأصفار الشرطية والواحدة. يمكن تمثيل أي من الأرقام التي اعتدنا عليها (الرقم العشري؛ بالنسبة لهم هناك 10 أرقام مختلفة من 0 إلى 9، والتي نكتب بها أي أرقام) في نظام الأرقام الثنائية. يمكنك تحويل رقم عشري إلى ثنائي باستخدام التقسيم التسلسلي إلى عمود باستخدام قاعدة نظام الأرقام (2). باقي القسمة في كل خطوة، مكتوبة بترتيب عكسي، ستعطينا الرقم الثنائي المطلوب. وهنا، على سبيل المثال، تحويل الرقم العشري 103 إلى تمثيل ثنائي: |
^
نظام الأرقام الثنائية في دورة JavaRush في دورة JavaRush، يتحدثون عن نظام الأرقام الثنائية أثناء دراسة مهمة MultiThreading (المستوى 10، المحاضرة 1)؛ بعد المحاضرة هناك عدة مهام للدمج. ومع ذلك، فإن هذا الموضوع ليس صعبًا على الإطلاق، وحتى إذا لم تكن قد وصلت إلى هذا الحد في الدورة بعد، فمن المحتمل أن تكتشفه. |
&
، تستخدم |
Java ^
أيضًا عوامل تشغيل bitwise:
~
عامل النفي bitwise>>
إزاحة bitwise لليمين>>>
التحول الأيمن غير الموقعة<<
تحول اتجاه البت إلى اليسار
عوامل تشغيل Bitwise &، | و ^
دعونا نلقي نظرة على مثال لكيفية عمل هذه العوامل. لنفترض أن لدينا عددين صحيحين:int a = 25;
int b = 112;
نحن بحاجة إلى تطبيق ثلاث عمليات عليهم &
، |
وعرض ^
النتيجة على الشاشة. هنا هو رمز البرنامج:
public class Solution {
public static void main(String[] args) {
int a = 25;
int b = 112;
int res1 = a & b;
int res2 = a | b;
int res3 = a ^ b;
System.out.println("a & b = " + res1);
System.out.println("a | b = " + res2);
System.out.println("a ^ b = " + res3);
}
}
نتيجة البرنامج هي كما يلي:
a & b = 16
a | b = 121
a ^ b = 105
إذا كنت لا تفهم ما يحدث، فإن النتيجة تبدو غامضة للغاية. في الواقع، كل شيء أبسط مما يبدو. "يرى" مشغلو Bitwise أرقام المعامل في شكلها الثنائي. ثم يقومون بتطبيق العوامل المنطقية &
، |
أو ^
على الأرقام (البتات) المقابلة لكلا الرقمين. لذلك، بالنسبة &
للبت الأخير من التمثيل الثنائي للرقم 25، يتم إضافة البت الأخير من التمثيل الثنائي للرقم 112 منطقيًا إلى البت قبل الأخير مع البت قبل الأخير، وهكذا: يمكن تتبع نفس المنطق في حالة |
و ^
.
تحول البت إلى اليسار أو اليمين
هناك العديد من مشغلي التحول قليلا في جافا. عوامل التشغيل الأكثر استخدامًا<<
هي و >>
. يقومون بنقل التمثيل الثنائي للرقم إلى اليسار أو اليمين، على التوالي، وفي حالة التحول إلى اليمين، مع الحفاظ على العلامة (سنشرح ما يعنيه الحفاظ على العلامة أدناه). هناك مشغل آخر للتحول الأيمن >>>
. يفعل نفس الشيء ولكن >>
لا يحفظ العلامة. لذلك، دعونا نلقي نظرة على عملهم باستخدام مثال. int a = 13
a << 1
ينقل كل بتات التمثيل الثنائي للرقم a إلى اليسار بمقدار 1 بت. للتبسيط، دعونا نمثل الرقم 13 في شكل ثنائي على أنه 0000 1101. في الواقع، يبدو هذا الرقم كما يلي: 00000000 00000000 00000000 00001101، نظرًا لأن Java int
تخصص 4 بايت أو 32 بت للأرقام. ومع ذلك، هذا لا يلعب دورًا في المثال، لذلك في هذا المثال سنعتبر رقمنا هو بايت واحد. الجزء الذي تم إخلاؤه على اليمين مملوء بالأصفار. ونتيجة لهذه العملية، نحصل على الرقم 26. a << 2
وهو ينقل جميع بتات التمثيل الثنائي للرقم a
إلى اليسار بمقدار 2 بت، ويتم ملء البتتين الفارغتين على اليمين بالأصفار. ونتيجة لذلك، سوف نحصل على الرقم 52. a << 3
والنتيجة ستكون 104... لاحظ النمط؟ يعمل النقل باتجاه البت a
إلى اليسار بمقدار n من المواضع مثل ضرب رقم a
في 2 أس n. وينطبق الشيء نفسه على الأرقام السالبة. وهذا -13 << 3
سيعطي النتيجة -104. a >> n
يزيح التمثيل الثنائي لعدد n من المواضع إلى اليمين. على سبيل المثال، 13 >> 1
تحويل الرقم 1101 إلى الرقم 0110، أي 6. 13 >> 2
وستكون النتيجة 3. أي، في الجوهر، هنا نقسم الرقم على 2 أس n، حيث n هو عدد التحولات إلى اليمين، ولكن مع تحذير واحد: إذا كان الرقم فرديًا، أثناء هذه العملية يبدو أننا قمنا بإعادة ضبط الجزء الأخير من الرقم. ولكن مع السلبية الوضع مختلف بعض الشيء. لنفترض أنك حاولت التحقق مما سينتجه البرنامج إذا طلبت منه إجراء عملية ما -13 >> 1
. سترى الرقم -7 وليس -6 كما تظن. يحدث هذا بسبب الطريقة التي يتم بها تخزين الأرقام السالبة في Java ولغات البرمجة الأخرى. يتم تخزينها فيما يسمى بالكود التكميلي. في هذه الحالة، يتم إعطاء الرقم الأكثر أهمية (الرقم الموجود على اليسار) للعلامة. في حالة الرقم السالب، الرقم الأكثر أهمية هو 1.
رمز إضافي
دعونا نفكر في الرقمint a = 13
. إذا قمت في البرنامج بطباعة تمثيله الثنائي إلى وحدة التحكم باستخدام الأمر System.out.println(Integer.toBinaryString(a));
، فسنحصل على 1101. في الواقع، هذا تدوين مختصر، نظرًا لأن رقم النوع int
يشغل 4 بايت في الذاكرة، لذلك "يراه" الكمبيوتر أكثر مثله:
00000000 00000000 00000000 00001101
الرقم الأكثر أهمية هو الصفر، مما يعني أن لدينا عددًا موجبًا. للتحويل إلى كود إضافي:
-
نكتب الرقم -13 فيما يسمى "بالرمز المباشر". للقيام بذلك، قم بتغيير الرقم الأكثر أهمية في الرقم إلى 1.
نتيجة الإجراء:10000000 0000000 0000000 00001101
-
بعد ذلك، نقوم بعكس جميع البتات (نغير 0 إلى 1، ومن 1 إلى 0) باستثناء بت الإشارة. في الواقع، لقد قمنا بتغييره بالفعل.
نتيجة الإجراء:11111111 11111111 11111111 11110010
(نعم، يمكن الجمع بين الخطوتين 1 و2، ولكن من الأفضل التفكير في الأمر بهذه الطريقة)
- أضف 1 إلى الرقم الناتج
نتيجة الإجراء:11111111 11111111 11111111 11110011
-13 >> 1
. نظرًا لأن عامل التشغيل الخاص بنا >>
يحتفظ بالعلامة، ففي هذه العملية، يتم ملء جميع البتات المحررة على اليسار ليس بالأصفار، بل بالآحاد. وهكذا تحول الرقم
11111111 11111111 11111111 11110011
بت واحدة إلى اليمين، مما يؤدي إلى التسلسل التالي من البتات:
11111111 11111111 11111111 11111001
إذا قمنا بتحويل هذا الرقم إلى رمز مباشر (أي طرح 1 أولاً، ثم عكس جميع البتات باستثناء الأول) نحصل على الرقم:
10000000 00000000 00000000 00000111
أو -7. الآن بعد أن فهمنا عامل التحول الأيمن الذي يحافظ على الإشارة، سيصبح من الواضح كيف يختلف عن العامل >>>
. a >>> n
- هذه العملية عبارة عن إزاحة غير موقعة، أي أنها تقوم بإزاحة التمثيل الثنائي لرقم a
إلى اليمين بمقدار n بت، ولكنها تملأ n بتات التي تم إخلاؤها على اليسار ليس بالآحاد، مثل العامل >>
، ولكن بالأصفار. دعونا نقوم بالعملية -13 >>> 1
. لدينا بالفعل الرقم -13
في تكملة اثنين:
11111111 11111111 11111111 11110011
بالانتقال إلى اليمين بمقدار 1 بت وملء البت الحر بالصفر، نحصل على الرقم التالي:
01111111 11111111 11111111 11111001
ما يعطي الرقم في التدوين العشري 2147483641
.
عامل النفي bitwise ~
يعمل هذا العامل الأحادي بكل بساطة: فهو يعكس كل بت من التمثيل الثنائي لعدد صحيح. لنأخذ الرقم-13
:
11111111 11111111 11111111 11110011
ستؤدي عملية نفي البتات ~13
ببساطة إلى عكس قيمة كل بت. ونتيجة لذلك نحصل على:
00000000 00000000 00000000 00001100
أو 12
في شكل عشري.
استنتاجات موجزة
- تنطبق جميع العوامل المنطقية على التعبيرات المنطقية، أي تلك التي يمكن القول بأنها صحيحة أو خاطئة .
- Если операторы
&
,|
or^
применяются к числам, речь идёт уже не о логических операциях, а о побитовых. То есть оба числа переводятся в двоичную систему и к этим числам побитово применяют операции логического сложения, умножения or вычитания. - В математической логике операторам
&
и|
соответствуют конъюнкция и дизъюнкция. - Логическое И похоже на умножения 1 (true) и 0 (false).
- Логическое ИЛИ напоминает поиск максимума среди 1 (true) и 0 (false).
- Для побитового отрицания целого числа a используется операция
~a
. - Для логического отрицания булевского выражения a используется операция
!a
. - Отрицательные числа хранятся и обрабатываются в дополнительном codeе.
- Поразрядный сдвиг вправо может сохранять знак (
>>
), а может — не сохранять (>>>
).
GO TO FULL VERSION