[java] ماذا يعني هذا المنطقي "(رقم 1) == 0"؟


3 Answers

يمكنك تحديد الرقم إما زوجي أو فردي بواسطة البت الأخير في تمثيله الثنائي:

1 -> 00000000000000000000000000000001 (odd)
2 -> 00000000000000000000000000000010 (even)
3 -> 00000000000000000000000000000011 (odd)
4 -> 00000000000000000000000000000100 (even)
5 -> 00000000000000000000000000000101 (odd)
6 -> 00000000000000000000000000000110 (even)
7 -> 00000000000000000000000000000111 (odd)
8 -> 00000000000000000000000000001000 (even)

& بين اثنين من الأعداد الصحيحة هي ANDIS AND عامل التشغيل:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

لذا ، إذا كان (number & 1) == 0 true ، فهذا يعني أن number هو حتى.

لنفترض أن number == 6 ، ثم:

6 -> 00000000000000000000000000000110 (even)

     &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

1 -> 00000000000000000000000000000001

-------------------------------------

0 -> 00000000000000000000000000000000

وعندما يكون number == 7 :

7 -> 00000000000000000000000000000111 (odd)

     &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

1 -> 00000000000000000000000000000001

-------------------------------------

1 -> 00000000000000000000000000000001
Question

على CodeReview قمت بنشر جزء من التعليمات البرمجية وطلبنا نصائح لتحسينه. واحد حصلت عليه هو استخدام طريقة منطقية للتحقق مما إذا كان ArrayList كان عدد زوجي من المؤشرات (التي كانت مطلوبة). هذا هو الرمز الذي تم اقتراحه:

private static boolean isEven(int number)
{
    return (number & 1) == 0;
}

وبما أنني قمت بالفعل بمضايقة هذا المستخدم الخاص للحصول على الكثير من المساعدة ، فقد قررت أن الوقت قد أفسد مجتمع SO! لا أفهم حقا كيف يعمل هذا. يتم استدعاء الأسلوب ويأخذ حجم ArrayList كمعلمة (أي ArrayList يحتوي على عشرة عناصر ، number = 10).

أنا أعرف واحدة & تدير مقارنة كل من الرقم و 1 ، لكنني ضللت بعد ذلك.

بالطريقة التي قرأتها ، فإنها تقول أن الإرجاع صحيح إذا كان number == 0 و 1 == 0 . أعلم أن الأولى ليست صحيحة ، ومن الواضح أن الأخيرة ليست منطقية. هل باستطاعة اي احد مساعدتي خارجا؟

تعديل: ربما ينبغي لي أن أضيف أن الشفرة لا تعمل ، في حال كان أي شخص يتساءل.




وهي تقوم بتنفيذ ثنائي ومقابل 1 ، والتي تقوم بارجاع 0 اذا لم يتم تحديد البتة الأقل دلالة

على سبيل المثال الخاص بك

00001010 (10)

00000001 (1)

===========

00000000 (0)




& هي عملية AND

للرقم = 8:

  1000
  0001
& ----
  0000

والنتيجة هي (8 & 1) == 0 . هذا هو الحال بالنسبة لجميع الأرقام الزوجية ، حيث أنها مضاعفات 2 ، وأول رقم ثنائي من اليمين هو دائمًا 0. 1 له قيمة ثنائية 1 مع 0S ، لذلك عندما نكون AND مع رقم زوجي نحن تركت مع 0.




هذا التعبير يعني "العدد الصحيح يمثل عدد زوجي".

هذا هو السبب: التمثيل الثنائي للقيمة العشرية 1 هو 00000000001 . تنتهي جميع الأرقام الفردية في 1 في ثنائي (من السهل التحقق من ذلك: لنفترض أن التمثيل الثنائي للأرقام لا ينتهي بـ 1 ؛ ثم يتكون من قوى غير صفرية تتكون من اثنتين ، وهي دائمًا رقم زوجي). عندما تفعل ثنائي AND مع رقم فردي ، تكون النتيجة 1 ؛ عند إجراء ثنائي AND مع رقم زوجي ، تكون النتيجة 0 .

كان هذا هو الأسلوب المفضل لتقرير الغريب / حتى العودة في الوقت الذي كان فيه المحسنون ضعيفين إلى غير موجودين ، و % المشغلين تطلبوا عشرين ضعف عدد الدورات المأخوذة من قبل المشغل. في هذه الأيام ، إذا قمت number % 2 == 0 ، فمن المحتمل أن يقوم المحول البرمجي بإنشاء التعليمة البرمجية التي يتم تنفيذها بسرعة (number & 1) == 0 .




Related