JavaRush /مدونة جافا /Random-AR /العوامل المنطقية في جافا

العوامل المنطقية في جافا

نشرت في المجموعة
العمليات المنطقية في جافا  عمليات Bitwise في Java - 1

العمليات المنطقية في جافا

يتم تنفيذ العمليات المنطقية باستخدام عوامل التشغيل المنطقية. عذرا على الحشو، ولكن هذا هو بالضبط ما هي الأمور. يمكن تطبيق العمليات المنطقية الأساسية (في البرمجة والرياضيات) على الوسائط المنطقية (المعاملات)، ويمكن استخدامها أيضًا لتكوين تعبيرات أكثر تعقيدًا، على غرار العمليات الحسابية على الأرقام. على سبيل المثال التعبير:

(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 a
  • int a = 2- ليس معاملًا منطقيًا ، بل هو مجرد متغير من النوعint
  • String a = "true"هو أيضا ليس معاملا منطقيا . هذه سلسلة قيمتها النصية هي "true".
العمليات المنطقية التالية متوفرة في Java:
  • النفي المنطقي ، المعروف أيضًا 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) الثنائية تمامًا مثل، |ولكن إذا كان العامل الموجود على اليسار صحيحًا ، فسيرجع العامل صحيحًا دون التحقق من المعامل الثاني.

العمليات المنطقية في دورة JavaRush

ليس هناك مفر من العمليات المنطقية، وفي دورة JavaRush تظهر من المستويات الأولى، إلى جانب الشروط ونوع البيانات المنطقية. يتعلم المبرمجون تدريجيًا كيفية استخدام أساليب المنطق الرياضي. لمزيد من التلاعب الواثق باستخدام الإنشاءات المنطقية، يلزم توفر بعض البراعة وفهم عمليات معينة. لذلك يتم التعامل مع هذه العمليات بمزيد من التفصيل وعلى مستوى مختلف تمامًا في نهاية مهمة Multithreading، عندما لم يعد معظم الطلاب مشتتين بشكل مباشر من خلال بناء الجملة والإنشاءات، لكنهم حاولوا الخوض في جوهر المهمة.

العمليات المنطقية في جافا  عمليات Bitwise في Java - 2

عامل النفي المنطقي!

هذا العامل أحادي، مما يعني أنه ينطبق على تعبير أو معامل منطقي واحد. من السهل جدًا فهمه، مثل أي نفي: يقوم العامل ببساطة بتغيير معنى التعبير إلى نقيضه. جدول الحقيقة أو نتائج إجراء عملية النفي:
قيمة أ
خطأ شنيع حقيقي
حقيقي خطأ شنيع
مثال. عملية النفي المنطقية
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، وهو أيضًا نتيجة عمل المشغلba & b&&|&
أ ب أ & ب
حقيقي حقيقي حقيقي
حقيقي خطأ شنيع خطأ شنيع
خطأ شنيع حقيقي خطأ شنيع
خطأ شنيع خطأ شنيع خطأ شنيع
منطقية AND، وهي أيضًا أداة اقتران، أمثلة:
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 ( صحيح )، فإننا نحصل على صحيح تمامًا . أو جدول الحقيقة، المعروف أيضًا بنتيجة العامل |:
أ ب أ | ب
حقيقي حقيقي حقيقي
حقيقي خطأ شنيع حقيقي
خطأ شنيع حقيقي حقيقي
خطأ شنيع خطأ شنيع خطأ شنيع
منطقية OR، والمعروفة أيضًا باسم الانفصال، مثال:
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

أولوية العمليات المنطقية

كما هو الحال في الرياضيات، في البرمجة، يكون لدى المشغلين ترتيب محدد للتنفيذ عندما يظهرون في نفس التعبير. تتمتع العوامل الأحادية بمزايا مقارنة بالعمليات الثنائية، والضرب (حتى المنطقي) على الجمع. لقد صنفنا العوامل المنطقية في مرتبة أعلى في القائمة، وكلما زادت أولويتها:
  1. !
  2. &
  3. ^
  4. |
  5. &&
  6. ||
دعونا نلقي نظرة على الأمثلة. للاقتران والانفصال ( &و |) أسبقية مختلفة:
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 . نتيجة هذا البرنامج : intq == 5qc

true
يمكن استخدام التعبيرات المنطقية المعقدة لاختبار شروط معقدة ومتفرعة للغاية، ولكن لا ينبغي الإفراط في استخدامها: فهي تجعل قراءة التعليمات البرمجية صعبة.

عوامل تشغيل Bitwise (bitwise).

في بداية المقال، ذكرنا أن العوامل يمكن &استخدامها فيما يتعلق بأنواع الأعداد الصحيحة في Java. في هذه الحالة هم مشغلي bitwise. وتسمى أيضًا بالبت، نظرًا لأن الرقم الواحد هو بت واحد، وتعمل هذه العمليات بشكل خاص مع البتات. وبطبيعة الحال، فإنها تعمل بشكل مختلف إلى حد ما عن العوامل المنطقية، ولكي تفهم بالضبط كيف، عليك أن تعرف ما هو نظام الأرقام الثنائية. إذا كنت لا تعرف شيئًا عنها أو نسيتها تمامًا، نقترح عليك أولاً قراءة المقالة Java: bits and bytes وتذكير الجميع أنه في نظام الأرقام الثنائية يوجد رقمان فقط - 0 و1، وجميع البيانات في الكمبيوتر يتم تمثيلها بدقة باستخدام الأصفار الشرطية والواحدة. يمكن تمثيل أي من الأرقام التي اعتدنا عليها (الرقم العشري؛ بالنسبة لهم هناك 10 أرقام مختلفة من 0 إلى 9، والتي نكتب بها أي أرقام) في نظام الأرقام الثنائية. يمكنك تحويل رقم عشري إلى ثنائي باستخدام التقسيم التسلسلي إلى عمود باستخدام قاعدة نظام الأرقام (2). باقي القسمة في كل خطوة، مكتوبة بترتيب عكسي، ستعطينا الرقم الثنائي المطلوب. وهنا، على سبيل المثال، تحويل الرقم العشري 103 إلى تمثيل ثنائي: |^العمليات المنطقية في جافا  عمليات Bitwise في Java - 3

نظام الأرقام الثنائية في دورة 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 منطقيًا إلى البت قبل الأخير مع البت قبل الأخير، وهكذا: العمليات المنطقية في جافا  عمليات Bitwise في Java - 4يمكن تتبع نفس المنطق في حالة |و ^. العمليات المنطقية في جافا  عمليات Bitwise في Java - 5

تحول البت إلى اليسار أو اليمين

هناك العديد من مشغلي التحول قليلا في جافا. عوامل التشغيل الأكثر استخدامًا <<هي و >>. يقومون بنقل التمثيل الثنائي للرقم إلى اليسار أو اليمين، على التوالي، وفي حالة التحول إلى اليمين، مع الحفاظ على العلامة (سنشرح ما يعنيه الحفاظ على العلامة أدناه). هناك مشغل آخر للتحول الأيمن >>>. يفعل نفس الشيء ولكن >>لا يحفظ العلامة. لذلك، دعونا نلقي نظرة على عملهم باستخدام مثال. int a = 13 a << 1ينقل كل بتات التمثيل الثنائي للرقم a إلى اليسار بمقدار 1 بت. للتبسيط، دعونا نمثل الرقم 13 في شكل ثنائي على أنه 0000 1101. في الواقع، يبدو هذا الرقم كما يلي: 00000000 00000000 00000000 00001101، نظرًا لأن Java intتخصص 4 بايت أو 32 بت للأرقام. ومع ذلك، هذا لا يلعب دورًا في المثال، لذلك في هذا المثال سنعتبر رقمنا هو بايت واحد. العمليات المنطقية في جافا  عمليات Bitwise في Java - 6الجزء الذي تم إخلاؤه على اليمين مملوء بالأصفار. ونتيجة لهذه العملية، نحصل على الرقم 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
الرقم الأكثر أهمية هو الصفر، مما يعني أن لدينا عددًا موجبًا. للتحويل إلى كود إضافي:
  1. نكتب الرقم -13 فيما يسمى "بالرمز المباشر". للقيام بذلك، قم بتغيير الرقم الأكثر أهمية في الرقم إلى 1.
    نتيجة الإجراء:

    
    10000000 0000000 0000000 00001101
  2. بعد ذلك، نقوم بعكس جميع البتات (نغير 0 إلى 1، ومن 1 إلى 0) باستثناء بت الإشارة. في الواقع، لقد قمنا بتغييره بالفعل.
    نتيجة الإجراء:

    
    11111111 11111111 11111111 11110010

    (نعم، يمكن الجمع بين الخطوتين 1 و2، ولكن من الأفضل التفكير في الأمر بهذه الطريقة)

  3. أضف 1 إلى الرقم الناتج
    نتيجة الإجراء:

    
    11111111 11111111 11111111 11110011
الرقم الثنائي الناتج هو -13، مكتوبًا بالرمز المكمل لشخصين، وسيتم تطبيق إزاحة البت (والعمليات الأخرى) عليه خصيصًا. إن الاختلاف في منطق العملية ليس ملحوظًا في جميع العمليات. لنفترض أنه بالنسبة لنفس التحول إلى اليسار، يكون الفرق غير ملحوظ؛ يمكننا العمل مع الأرقام السالبة بنفس الطريقة كما هو الحال مع الأرقام الموجبة. الآن دعونا نتحول إلى اليمين -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е.
  • Поразрядный сдвиг вправо может сохранять знак (>>), а может — не сохранять (>>>).
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION