जावा में "तार्किक अनन्य या" ऑपरेटर बनाना


274

टिप्पणियों:

जावा में एक तार्किक और ऑपरेटर है।
जावा में एक तार्किक OR ऑपरेटर है।
जावा में तार्किक नहीं ऑपरेटर है।

संकट:

सूरज के अनुसार जावा का कोई तार्किक XOR ऑपरेटर नहीं है । मैं एक को परिभाषित करना चाहूंगा।

विधि परिभाषा:

एक विधि के रूप में इसे केवल इस प्रकार परिभाषित किया गया है:

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


विधि कॉल:

इस विधि को निम्नलिखित तरीके से कहा जाता है:

boolean myVal = logicalXOR(x, y);


ऑपरेटर उपयोग:

मेरे पास एक ऑपरेटर के रूप में बहुत कुछ होगा, निम्नानुसार है:

boolean myVal = x ^^ y;


सवाल:

मुझे जावा में एक नए ऑपरेटर को परिभाषित करने के बारे में कुछ भी नहीं मिल सकता है। मुझे कहां से शुरू करना चाहिए?


1
क्या? आपके द्वारा दी गई लिंक में 'बिटवाइज़ एक्सक्लूसिव OR' है
मैथ्यू पी। जोन्स

क्या आप सोच रहे थे कि यदि आप जावा में ऑपरेटरों को परिभाषित कर सकते हैं जैसे कि आप C ++ में कर सकते हैं?
एविग्स्टव्स

1
ऐसा लगता है कि आपने & && के बीच के अंतर को गलत समझा। दोनों तार्किक ऑपरेटर हैं (बूलियन पर)। Starblue का उत्तर इसे अधिक व्यापक रूप से कवर करता है।
व्लासेक

सिर्फ इसलिए कि यह ट्यूटोरियल में नहीं है, इसका मतलब यह नहीं है कि जावा में यह नहीं है - ट्यूटोरियल हमेशा (पूर्ण) नहीं होते हैं। जावा भाषा विनिर्देश 15.22.2
user85421

5
यह कहा जाता है !=, एक तार्किक XNOR भी है जिसे कहा जाता है==
मार्क के कोवान

जवाबों:


695

जावा में एक तार्किक XOR ऑपरेटर है , यह ^ (as 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);
        }
    }
}

आउटपुट:

झूठी ^ झूठी = झूठी
झूठी ^ सच = सच
सत्य ^ असत्य = सत्य
सत्य ^ सत्य = असत्य

5
यह मेरी स्मृति से बच गया जब मैंने अपनी पोस्ट लिखी थी, लेकिन मुझे लगता है कि आप ^ का उपयोग तार्किक ऑपरेटर (और साथ ही बिटवाइज़) के रूप में कर सकते हैं।
नील कॉफ़ी

144
^ न केवल एक बिटवाइज़ ऑपरेटर है। यह एक तार्किक ऑपरेटर भी है। ^ ऑपरेटर ओवरलोड है। यह अभिन्न प्रकार या बूलियन प्रकार पर संचालित होता है। एक महान जवाब javashlook के लिए +1। एडी, यह जेएलएस धारा 15.22.2 से अधिक स्पष्ट नहीं है, "बूलियन लॉजिकल ऑपरेटर्स और, ^, और |"।
इरिकसन

97
और हां, जवाब है कि && और || अभिव्यक्ति के 2 भाग का मूल्यांकन करना छोड़ देगा और & | हमेशा अभिव्यक्ति के दोनों हिस्सों (JLS के मेरे पढ़ने से) का मूल्यांकन करेगा। ए ^ ^ को हमेशा परिभाषा के अनुसार, दोनों हिस्सों का मूल्यांकन करना होगा, इसलिए ^ के लिए समान व्यवहार करता है। शायद इसलिए कोई ^ ^ नहीं है
एडी

81
@ ईडी: वह और ^ ^ बस एक इमोटिकॉन की तरह बहुत अधिक दिखता है।
माइकल मायर्स

5
शायद यह शब्दार्थों की बात है, लेकिन जब यह XOR की बात आती है, तो बिटवाइज़ और लॉजिकल परिणाम समान होते हैं। इसलिए, अलग ऑपरेटरों के लिए कोई ज़रूरत नहीं है। एक XOR ऑपरेटर के लिए सरलीकृत सत्य तालिका X ^ है! X = 1. आप XOR में किसी इनपुट को शॉर्ट सर्किट नहीं कर सकते क्योंकि आपको यह निर्धारित करना होगा कि इनपुट अलग-अलग हैं या नहीं। यह समझना बहुत आसान है कि क्या आप वास्तविक XOR गेट के निर्माण को जानते हैं।
hfontanez

305

क्या यह x = y नहीं है?


5
यदि x और y बूलियन हैं, तो xor और = के लिए तर्क तालिका समान हैं: t, t => f; टी, एफ => टी; एफ, टी => टी; f, f => f
ग्रेग केस

81
मौरिस: Arrgh तुम बस मेरे दिमाग उड़ा दिया! मैंने इसे कभी नोटिस कैसे किया?

8
@Milhous आप कह रहे हैं a != b != cकाम नहीं करेगा, लेकिन a ^ b ^ cहोगा? उस मामले में, आप गलत हैं
fredoverflow

3
मौरिस, बस शानदार! यह मेरे लिए होता है कि जब वे बहुत कुछ करते हैं तो दृष्टि से सरल चीजों को खो देते हैं :)
सबेरेसिन

6
यह एप्रोच निहित है जब दोनों पक्ष आवरण वर्ग होते हैं, new Boolean(true) != new Boolean(true)देते हैं true
वल्टिमिल ओवसिक्क

74

जावा में एक तार्किक और ऑपरेटर है।
जावा में एक तार्किक OR ऑपरेटर है।

गलत।

जावा है

  • दो तार्किक और ऑपरेटर: सामान्य और है और शॉर्ट-सर्किट और है &&, और
  • दो तार्किक या ऑपरेटर: सामान्य या है | और शॉर्ट-सर्किट या है ||

XOR केवल ^ के रूप में मौजूद है, क्योंकि शॉर्ट-सर्किट मूल्यांकन संभव नहीं है।


2
रोचक टिप्पणी। क्या वह प्रलेखित है?
user666412

1
मुझे लगता है और | शॉर्ट-सर्किट नहीं हैं क्योंकि वे बिटवाइज़ ऑपरेटर हैं। और वास्तव में उन्हें शॉर्ट-सर्किट करना संभव नहीं है।
Krzysztof Jabłoński

3
@Krzysztof Jabłoński वे संख्याओं पर बिटवाइज़ ऑपरेटर हैं, लेकिन यहाँ हम बूलियन अभिव्यक्तियों के बारे में बात कर रहे हैं।
starblue

3
@ user666412 हाँ, जावा लैंग्वेज स्पेसिफिकेशन में (जहाँ पर?)।
starblue

18
यदि इसमें 2 और ऑपरेटर और 2 OR ऑपरेटर हैं तो 'Java में तार्किक और ऑपरेटर' कथन हैं और 'Java में तार्किक OR ऑपरेटर है' गलत नहीं है। परिभाषा के अनुसार यदि आपके पास 2 में से कुछ है तो आपके पास भी इसमें से 1 है।
रायनफेस्कॉटलैंड

31

शायद आप के बीच के अंतर को गलत समझा &और &&, |और || शॉर्टकट ऑपरेटरों के उद्देश्य &&और ||है कि पहले संकार्य के मूल्य के परिणाम तय कर सकते हैं और इसलिए दूसरे संकार्य मूल्यांकन की आवश्यकता नहीं है।

यह विशेष रूप से उपयोगी है अगर दूसरे ऑपरेंड में कोई त्रुटि होगी। जैसे

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

हालाँकि, XOR के साथ , आपको परिणाम प्राप्त करने के लिए हमेशा दूसरे ऑपरेंड का मूल्यांकन करना होगा ताकि केवल सार्थक संचालन हो ^


20

आप बस लिख सकते हैं (a!=b)

यह उसी तरह काम करेगा जैसे कि a ^ b


9

ऐसा इसलिए है क्योंकि ऑपरेटर ओवरलोडिंग एक ऐसी चीज है जिसे वे विशेष रूप से जानबूझकर भाषा से बाहर छोड़ देते हैं। वे स्ट्रिंग कॉन्सेप्टेशन के साथ थोड़ा धोखा देते हैं, लेकिन इससे परे, ऐसी कार्यक्षमता मौजूद नहीं है।

(अस्वीकरण: मैंने जावा के अंतिम 2 प्रमुख रिलीज के साथ काम नहीं किया है, इसलिए यदि यह अभी है, तो मुझे बहुत आश्चर्य होगा)


5
ध्यान रखें कि आप C ++ में नए ऑपरेटरों को परिभाषित नहीं कर सकते हैं। आप बस इतना कर सकते हैं कि पुराने को नया अर्थ दें।
डेविड थॉर्नले

7

जावा में एकमात्र ऑपरेटर ओवरलोडिंग स्ट्रिंग्स पर + ( जेएलएस 15.18.1 स्ट्रिंग कॉन्टैकेनेशन ऑपरेटर + ) है।

समुदाय को 3 वर्षों में विभाजित किया गया है, 1/3 इसे नहीं चाहता है, 1/3 इसे चाहता है, और 1/3 परवाह नहीं करता है।

आप यूनिकोड का उपयोग उन विधियों के नाम बनाने के लिए कर सकते हैं जो प्रतीक हैं ... इसलिए यदि आपके पास कोई ऐसा प्रतीक है जिसका आप उपयोग करना चाहते हैं तो आप मेरा नाम = x। $ (Y) कर सकते हैं; जहां $ प्रतीक है और x एक आदिम नहीं है ... लेकिन यह कुछ संपादकों में धूमिल होने वाला है और तब से सीमित है जब आप इसे एक आदिम पर नहीं कर सकते।


7

निम्नलिखित आपके कोड:

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

शानदार है।

लिखने के लिए क्यों नहीं:

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

?

इसके अलावा, जैसा कि javashlook ने कहा , पहले से ही ^ऑपरेटर है।

!=और ^बूलियन ऑपरेंड्स (आपके मामले) के लिए समान रूप से काम करते हैं, लेकिन पूर्णांक ऑपरेंड के लिए अलग तरह से।

* नोट्स:
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)(ऑफटॉपिक: ouch, C- शैली की पूर्वता तालिका बेकार)।


1
बूलियन मूल्यों के लिए मुझे पसंद है!=
GKalnytskyi

1
@GKalnytskyi Booleanमूल्यों के लिए !=गलत तरीके से काम करता है। के लिए booleanमूल्यों को यह ठीक है।
vadipp

2
=! और ^ बूलियन ऑपरेंड के लिए पहचान से काम नहीं करते हैं । आपको "गलत और गलत! =" सही बनाम "झूठे और झूठे" सच के लिए अलग-अलग परिणाम मिलेंगे।
अल्बर्ट हेंड्रिक्स

1
@AlbertHendriks, मैं बेहतर कहूँगा कि वे पहचान के साथ काम करते हैं, लेकिन उनकी अलग-अलग मिसालें हैं (हालाँकि यह सिर्फ शब्दावली की बात है)।
साशा

6

यहाँ जावा के लिए एक var arg XOR विधि है ...

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

का आनंद लें


ऐसा लगता है कि इसके पास कुछ बहुत ही अजीब व्यवहार होने जा रहा है। उदाहरण के लिए XOR(true,true,true), यह सच है, जो ऐसा नहीं लगता है जिसे आप नामक विधि से उम्मीद करेंगे XOR। मेरा अपेक्षित व्यवहार यह होगा कि यह हमेशा झूठा लौटता है (जो निश्चित रूप से उपयोगी नहीं है)
रिचर्ड टिंगल

4

लॉजिकल एक्सक्लूसिव-या जावा में कहा जाता है !=^यदि आप अपने दोस्तों को भ्रमित करना चाहते हैं तो आप इसका उपयोग भी कर सकते हैं ।


2

आप अधिभार ऑपरेटरों और जावा पर 'रहने' के लिए Xtend (Infix ऑपरेटर्स और ऑपरेटर ओवरलोडिंग) का उपयोग कर सकते हैं


ध्यान दें कि Xtend आपको कैरेट को ओवरराइड करने की अनुमति नहीं देता है ^; आप का उपयोग करना चाहिए bool_1.xor(bool_2)। अजीब तरह से, पार्सर भी आपको कैरेट का उपयोग करने की अनुमति नहीं देता है ; आपको xorबूलियन के लिए और bitwiseXorपूर्णांक के लिए उपयोग करना चाहिए । आप निश्चित रूप से किसी अन्य ऑपरेटर को ओवरलोड कर सकते हैं, लेकिन यह बहुत भ्रमित करेगा।
केल्विन

2

जो आप पूछ रहे हैं वह बहुत मायने नहीं रखेगा। जब तक मैं गलत नहीं हूँ आप सुझाव दे रहे हैं कि आप XOR का उपयोग लॉजिकल ऑपरेशन्स को उसी तरह करने के लिए करना चाहते हैं और OR करें। आपका प्रदान किया गया कोड वास्तव में दिखाता है कि मैं किससे प्रभावित हूं:

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

आपके फ़ंक्शन में बूलियन इनपुट हैं, और जब बिटवाइन्स पर बिटवाइज़ एक्सओआर का उपयोग किया जाता है तो परिणाम आपके द्वारा प्रदान किए गए कोड के समान होता है। दूसरे शब्दों में, व्यक्तिगत बिट्स (बूलियन्स) की तुलना करते समय या बड़े मानों में व्यक्तिगत बिट्स की तुलना करते समय बिटवाइज़ XOR पहले से ही कुशल है। इसे संदर्भ में रखने के लिए, द्विआधारी मूल्यों के संदर्भ में कोई भी गैर-शून्य मूल्य TRUE है और केवल शून्य शून्य है।

तो XOR को तार्किक और उसी तरह लागू करने के लिए, आप या तो केवल एक बिट (समान परिणाम और दक्षता देते हुए) के साथ द्विआधारी मूल्यों का उपयोग करेंगे या द्विआधारी मूल्य का मूल्यांकन प्रति बिट के बजाय पूरे के रूप में करना होगा। दूसरे शब्दों में अभिव्यक्ति (010 ^ ^ 110) = FALSE के बजाय (010 ^ ^ 110) = 100. यह ऑपरेशन से अधिकांश अर्थ अर्थ निकाल देगा, और एक तार्किक परीक्षण का प्रतिनिधित्व करता है जिसे आपको किसी भी तरह से उपयोग नहीं करना चाहिए।


1

ए और बी को बनाने के लिए बूलियन मान होना चाहिए! = एक्सआर के समान ही ताकि सच्चाई तालिका समान दिखे। तुम भी इस्तेमाल कर सकते हैं! (ए == बी) योग्य।


1

मैं बहुत लोकप्रिय वर्ग "org.apache.commons.lang.BooleanUtils" का उपयोग कर रहा हूं

इस विधि का परीक्षण कई उपयोगकर्ताओं और सुरक्षित द्वारा किया जाता है। मज़े करो। उपयोग:

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

0

क्योंकि बूलियन डेटा प्रकार एक पूर्णांक की तरह संग्रहीत होता है, बिट ऑपरेटर ^ बूलियन मानों के साथ उपयोग किए जाने पर 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
            */
        }
    }

0

यहाँ एक उदाहरण है:

2 अंतर मूल्यों को देखते हुए, यदि एक नकारात्मक है और एक सकारात्मक है तो वापस लौटें। सिवाय इसके कि यदि पैरामीटर "नकारात्मक" सत्य है, तो केवल तभी वापस लौटें जब दोनों नकारात्मक हों।

    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);
    }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.