سؤال

الملاحظات:

جافا لديه منطقية ومشغل.
يحتوي Java على منطقي أو مشغل.
جافا لديه مشغل منطقي وليس.

مشكلة:

Java ليس لديه أي مشغل XOR منطقي، وفقا للشمس. وبعد أود تحديد واحد.

طريقة تعريف:

كطريقة يتم تعريفها ببساطة على النحو التالي:

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}


طريقة الاتصال:

وتسمى هذه الطريقة بالطريقة التالية:

boolean myVal = logicalXOR(x, y);


استخدام المشغل:

وأود أن يكون لديك الكثير من المشغل، وتستخدم على النحو التالي:

boolean myVal = x ^^ y;


سؤال:

لا يمكنني العثور على أي شيء حول كيفية الذهاب حول تعريف مشغل جديد في Java. أين يجب أن تبدأ؟

هل كانت مفيدة؟

المحلول

جاوة هل لديك مشغل XOR المنطقي, ، أنه ^ (كما في a ^ b).

بصرف النظر عن ذلك، لا يمكنك تحديد مشغلين جدد في جافا.

يحرر: إليك مثال:

public static void main(String[] args) {
    boolean[] all = { false, true };
    for (boolean a : all) {
        for (boolean b: all) {
            boolean c = a ^ b;
            System.out.println(a + " ^ " + b + " = " + c);
        }
    }
}

انتاج:

False ^ False = False False ^ صحيح = صحيح صحيح ^ False = صحيح صحيح ^ صحيح = خطأ

نصائح أخرى

أليس من س! = ص؟

جافا لديه منطقية ومشغل.
يحتوي Java على منطقي أو مشغل.

خاطئ - ظلم - يظلم.

جاوة لديه

  • اثنين من المنطقي والمشغلين: طبيعي وغير واختصار ماس كهربائى و &&، و
  • اثنين من المنطقي أو المشغلين: عادي أو هو | وقصيرة ماس كهربائى أو هي ||.

XOR موجود فقط باسم ^، لأن تقييم الدائرة القصيرة غير ممكن.

ربما أسيء فهم الفرق بين & و &&, | و ||الغرض من مشغلي الاختصار && و || هو أن قيمة المعامل الأولى يمكن أن تحدد النتيجة، وبالتالي لا يحتاج المعامل الثاني إلى تقييمها.

هذا مفيد بشكل خاص إذا كان المعامل الثاني سينتج عنه خطأ. على سبيل المثال

if (set == null || set.isEmpty())
// or
if (list != null && list.size() > 0)

ولكن مع زور, ، يجب عليك دائما تقييم المعامل الثاني للحصول على النتيجة حتى تتمثل العملية الهادفة الوحيدة ^.

يمكنك فقط الكتابة (a!=b)

هذا من شأنه أن يعمل بنفس الطريقة a ^ b.

وذلك لأن التحميل الزائد للمشغل هو شيء تركوه على وجه التحديد من اللغة عمدا. لقد "خدعوا" بتسلسلات سلسلة، ولكن بعد ذلك، هذه الوظيفة غير موجودة.

(إخلاء المسئولية: لم أعمل مع آخر الإصدارات الرئيسية الرئيسية من جافا، لذلك إذا كان ذلك في الوقت الحالي، سأكون مفاجأة للغاية)

التحميل الزائد للمشغل الوحيد في Java هو + على السلاسل (JLS 15.18.1 مشغل سلسلة سلسلة +).

تم تقسيم المجتمع في 3 سنوات، 1/3 لا يريد ذلك، 1/3 يريد ذلك، و 1/3 لا يهتم.

يمكنك استخدام Unicode لإنشاء أسماء الأسلوب التي هي رموز ... لذلك إذا كان لديك رمز تريد استخدامه، فيمكنك القيام Myval = x. $ (y)؛ حيث $ هو الرمز و X ليس بدائيا ... ولكن هذا سيكون مراوغا في بعض المحررين والحد لأنه لا يمكنك القيام بذلك في بدائية.

ما يلي رمزك:

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}

غير ضروري.

لماذا لا تكتب:

public static boolean logicalXOR(boolean x, boolean y) {
    return x != y;
}

?

أيضا، كما جافاشغلوك قال, ، هناك بالفعل ^ المشغل أو العامل.

!= و ^ العمل بشكل متطابق * بالنسبة للأمعاء المنطقية (قضيتك)، ولكن بشكل مختلف بالنسبة للأمعاء الصحيحة.

* ملاحظات:
1. إنهم يعملون بشكل متطابق boolean (نوع بدائي)، ولكن ليس Boolean (نوع الكائن) المعاملات. كما Boolean (نوع الكائن) يمكن أن تكون القيم قيمة null. وبعد و != سيعود false أو true عندما واحد أو كليهما من معاملاتها null, ، في حين ^ سوف رمي NullPointerException في هذه الحالة.
2. على الرغم من أنها تعمل بشكل متطابق، إلا أن لديهم أسبقية مختلفة، على سبيل المثال عند استخدامها &: a & b != c & d سيتم التعامل معها a & (b != c) & d, ، في حين a & b ^ c & d سيتم التعامل معها (a & b) ^ (c & d) (offtopic: أوتش، طاولة الأسبقية نمط C تمتص).

هنا طريقة Var Arg Xor ل Java ...

public static boolean XOR(boolean... args) {
  boolean r = false;
  for (boolean b : args) {
    r = r ^ b;
  }
  return r;
}

استمتع

يمكنك استخدام Xtend (المشغلين INFIX وتحفيز المشغل) لمشغلي الزائد و "البقاء" على جافا

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

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}

دئتك لديها مدخلات منطقية، وعند استخدام bitwise xor على المنطاقين النتيجة هي نفس الكود الذي قدمته. بمعنى آخر، تعد XOR Bitwise فعالة بالفعل عند مقارنة البتات الفردية (المنطمنون) أو مقارنة البتات الفردية بالقيم الأكبر. لوضع هذا في سياق، من حيث القيم الثنائية أي قيمة غير صفرية صحيحة وفقط الصفر هو خطأ.

لذلك ليتم تطبيق نفس XOR بنفس الطريقة المنطقية وتطبيقها، فستستخدم فقط القيم الثنائية فقط مع بت واحد فقط (إعطاء نفس النتيجة والكفاءة) أو يجب تقييم القيمة الثنائية ككل بدلا من. بمعنى آخر تعبير (010 ^^ 110) = FALSE بدلا من (010 ^^ 110) = 100. سيقوم هذا بإزالة معظم المعنى الدلالي من العملية، ويمثل اختبارا منطقي لا يجب أن تستخدمه على أي حال.

يتم استدعاء الحصري المنطقي أو في جافا !=. وبعد تستطيع ايضا استخذام ^ إذا كنت ترغب في الخلط بين أصدقائك.

يجب أن تكون A و B القيم المنطقية لجعل! = نفس XOR بحيث يبدو أن جدول الحقيقة هو نفسه. يمكنك أيضا استخدام! (A == B) لول.

أنا أستخدم الطبقة الشائعة جدا "Org.apache.commons.lang.booleanutils"

تم اختبار هذه الطريقة من قبل العديد من المستخدمين وآمنة. استمتع. الاستعمال:

boolean result =BooleanUtils.xor(new boolean[]{true,false});

نظرا لأن نوع البيانات المنطقي يتم تخزينه مثل عدد صحيح ومشغل BIT ^ مثل عملية XOR إذا تم استخدامها مع القيم المنطقية.

//©Mfpl - XOR_Test.java

    public class XOR_Test {
        public static void main (String args[]) {
            boolean a,b;

            a=false; b=false;
            System.out.println("a=false; b=false;  ->  " + (a^b));

            a=false; b=true;
            System.out.println("a=false; b=true;  ->  " + (a^b));

            a=true;  b=false;
            System.out.println("a=true;  b=false;  ->  " + (a^b));

            a=true; b=true;
            System.out.println("a=true; b=true;  ->  " + (a^b));

            /*  output of this program:
                    a=false; b=false;  ->  false
                    a=false; b=true;  ->  true
                    a=true;  b=false;  ->  true
                    a=true; b=true;  ->  false
            */
        }
    }

إليك مثال:

إعطاء 2 قيم int، والعودة TRUE إذا كان المرء سلبيا وواحد إيجابي. إلا إذا كان المعلمة "السلبية" صحيحة، ثم إرجاع صحيح فقط إذا كانت كلاهما سلبي.

    public boolean posNeg(int a, int b, boolean negative) {
      if(!negative){
        return (a>0 && b<0)^(b>0 && a<0);
      }
      else return (a<0 && b<0);
    }

ستحتاج إلى التبديل إلى Scala لتنفيذ المشغلين الخاص بك

مثال على الأنابيب

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top