क्या बूलियन जांच के लिए एक्सर ऑपरेटर का उपयोग करना अच्छा है? [बन्द है]


150

मैं व्यक्तिगत रूप से अनन्य या , ^ऑपरेटर को पसंद करता हूं , जब यह अपनी संक्षिप्तता के कारण बूलियन जांच के संदर्भ में समझ में आता है। मैं लिखना ज्यादा पसंद करता हूं

if (boolean1 ^ boolean2)
{
  //do it
}

से

if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
  //do it
}

लेकिन मैं अक्सर अन्य अनुभवी जावा डेवलपर्स (न केवल newbies) से उलझन में दिखता है, और कभी-कभी टिप्पणी करता है कि इसे केवल बुद्धिमान कार्यों के लिए कैसे उपयोग किया जाना चाहिए।

मैं ^ऑपरेटर के उपयोग के बारे में सर्वोत्तम प्रथाओं के लिए उत्सुक हूं ।

जवाबों:


298

आप !=इसके बजाय बस का उपयोग कर सकते हैं ।


36
"मेरे साथ क्या गलत है! =" bool1 ^ bool2 ^ bool3 मुझसे ज्यादा तार्किक समझ में आता हैbool1 != bool2 != bool3
ब्लूराजा - डैनी पफ्लुगुएफ्ट

4
मेरा दिमाग दुखता है। तो? गलत परिणाम मिल सकता है या नहीं?
vemv

27
@vemv, s के !=लिए सही परिणाम देता है boolean(लेकिन Booleans के लिए इतना सावधान नहीं)। यह हमेशा बहुत सुंदर नहीं है, उदाहरण के लिए (some != null) != (other != null)बहुत पठनीय नहीं है। आपको या तो स्पष्ट बूलियन में भागों को निकालना होगा, या !=एक अलग विधि में निकालना होगा ।
ivant 12

23
यहाँ क्यों है: a ^ b=> "ए या बी लेकिन दोनों नहीं", a != b=> "ए बी के बराबर नहीं है"। (क्या @RobertGrant ने कहा)। अधिकांश मनुष्य पहले एक आसान को समझेंगे यदि वे जानते हैं कि क्या है जोर (जो कि आपके कंप्यूटिंग के क्षेत्र में है, यह जानने के लिए बहुत उपयोगी है ...)
हेरोल्ड आर। ईशान

2
@ HaroldR.Eason यहां महत्वपूर्ण नाइटपैकिंग: a != b=> "a is IDENTICAL to b"
मारियो पुनर्जन्म

27

मुझे लगता है कि आपने अपने स्वयं के प्रश्न का उत्तर दिया है - यदि आपको लोगों से अजीब लगता है, तो संभवतः अधिक स्पष्ट विकल्प के साथ जाना सुरक्षित है।

यदि आपको इसे टिप्पणी करने की आवश्यकता है, तो आप शायद इसे अधिक वर्बोज़ संस्करण के साथ बदलने और लोगों को पहली जगह में सवाल पूछने से बेहतर नहीं बना सकते हैं।


6
मैं आपको जोर दे सकता हूं, आप मुझ से अजीब लगेंगे, जब आप गंभीरता (boolean1 && !boolean2) || (boolean2 && !boolean1)से एक वास्तविक जीवन आवेदन कोड में लिखेंगे ...
होल्गर

17

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

मेरा सामान्य नियम यह पूछना है कि क्या जिस तकनीक का उपयोग किया जा रहा है वह कुछ ऐसा है जो सामान्य रूप से प्रोग्रामर से जानना अपेक्षित है। इस मामले में, मुझे लगता है कि प्रोग्रामर से यह जानना उचित है कि बूलियन ऑपरेटरों का उपयोग कैसे किया जाए, इसलिए यदि एक कथन में xor का उपयोग करना ठीक है।

एक ऐसी चीज़ के उदाहरण के रूप में, जो ठीक नहीं होगी, एक अस्थायी चर का उपयोग किए बिना दो चर को स्वैप करने के लिए xor का उपयोग करने की चाल लें। यह एक ऐसी चाल है जिससे मैं हर किसी को परिचित होने की उम्मीद नहीं करूंगा, इसलिए यह कोड समीक्षा पास नहीं करेगा।


14

मुझे लगता है कि यदि आपने यह टिप्पणी की है, तो यह ठीक होगा // ^ == XOR


10

आप हमेशा इसे एक क्रिया में लपेट सकते हैं ताकि इसे क्रिया नाम दिया जा सके:

public static boolean XOR(boolean A, boolean B) {
    return A ^ B;
}

लेकिन, यह मुझे लगता है कि यह किसी के लिए भी मुश्किल नहीं होगा जो यह नहीं जानता कि Google के लिए ^ ऑपरेटर वास्तव में जल्दी है। पहली बार के बाद याद रखना मुश्किल नहीं होगा। चूंकि आपने अन्य उपयोगों के लिए कहा है, तो बिट को मास्किंग के लिए XOR का उपयोग करने के लिए इसका सामान्य।

आप तीसरे अस्थायी चर का उपयोग किए बिना मानों को दो चर में स्वैप करने के लिए XOR का उपयोग कर सकते हैं ।

// Swap the values in A and B
A ^= B;
B ^= A;
A ^= B;

यहां XOR स्वैपिंग से संबंधित एक Stackoverflow प्रश्न है


6

मैंने हाल ही में एक जावास्क्रिप्ट परियोजना में एक काम में xor का उपयोग किया और यह बताने के लिए टिप्पणियों की 7 पंक्तियों को जोड़ दिया कि क्या चल रहा था। उस संदर्भ में XOR का उपयोग कर के लिए औचित्य के मामले (की कि एक था term1नीचे दिए गए उदाहरण में) नहीं दो लेकिन तीन मूल्यों पर ले सकता है: undefined, trueया falseअन्य, जबकि ( term2) हो सकता है trueया false। मुझे undefinedमामलों के लिए एक अतिरिक्त जांच जोड़ना होगा , लेकिन एक्सोर के साथ, निम्नलिखित पर्याप्त था क्योंकि एक्सोर पहले शब्द को पहले बूलियन के रूप में मूल्यांकन करने के लिए मजबूर करता है, जिससे undefinedइलाज किया जाता है false:

if (term1 ^ term2) { ...

यह अंत में, एक ओवरकिल का एक सा था, लेकिन मैं इसे एक ईस्टर अंडे की तरह, वैसे भी वहाँ रखना चाहता था।


IMHO, अंतर्निहित रूपांतरण पर भरोसा करने के बजाय, ऐसी स्थिति में जो मुठभेड़ के लिए असामान्य है, रूपांतरण को स्पष्ट करना बेहतर है । और सामान्य तौर पर, "अपरिभाषित होने को झूठा करार दिया जाना" किसी भी भाषा में एक संदिग्ध व्यवहार है। मैंने जावा में त्रि-राज्य मानों का उपयोग नहीं किया है, लेकिन C # में, एक bool? aमूल्य का स्पष्ट रूप से सही उपयोग के लिए परीक्षण किया जा सकता है a == true- क्या जावा में एक समान तकनीक है? C # में, दो bool?मान दिए गए हैं, "अशक्त को झूठा मानें" (a == true) ^ (b == true)। एक समतुल्य सूत्र है (a == true) != (b == true)। क्या आप जावा में कुछ ऐसा कर सकते हैं?
टूलमेकरसैट

5
if((boolean1 && !boolean2) || (boolean2 && !boolean1)) 
{ 
  //do it 
} 

IMHO इस कोड को सरल बनाया जा सकता है:

if(boolean1 != boolean2) 
{ 
  //do it 
} 

5

मन में कोड स्पष्टता के साथ, मेरी राय यह है कि बूलियन चेक में XOR का उपयोग करना XOR बिटवाइज़ ऑपरेटर के लिए विशिष्ट उपयोग नहीं है। मेरे अनुभव से, जावा में बिटकॉइन XOR का उपयोग आमतौर पर मुखौटा flag toggleव्यवहार को लागू करने के लिए किया जाता है :

flags = flags ^ MASK;

विपन सिंगला का यह लेख उपयोग के मामले को विस्तार से बताता है।

यदि आपको अपने उदाहरण के रूप में बिटवाइज़ XOR का उपयोग करने की आवश्यकता है, तो टिप्पणी करें कि आप इसका उपयोग क्यों करते हैं, क्योंकि यह समझने की आवश्यकता है कि बिटकॉइन साक्षर दर्शकों को यह समझने की आवश्यकता है कि आप इसका उपयोग क्यों कर रहे हैं।


-1

मैं व्यक्तिगत रूप से "बूलियन 1 ^ बूलियन 2" की अभिव्यक्ति को इसकी सफलता के कारण पसंद करता हूं।

अगर मैं आपकी स्थिति में था (एक टीम में काम कर रहा था), तो मैं एक डिस्क्रिप्टिव नाम (boolean1, boolean2) "जैसे" नाम के साथ एक फ़ंक्शन में "boolean1 ^ boolean2" तर्क को दबाकर एक समझौता करूंगा।

उदाहरण के लिए, "बूलियन 1 ^ बूलियन 2" का उपयोग करने के बजाय, आप कॉल करेंगे "डिफर्डेंट (बूलियन 1, बूलियन 2)" जैसे:

if (isDifferent(boolean1, boolean2))
{
  //do it
}

आपका "Different (बूलियन 1, बूलियन 2) "फ़ंक्शन ऐसा दिखेगा:

private boolean isDifferent(boolean1, boolean2)
{
    return boolean1 ^ boolean2;
}

बेशक, यह समाधान एक ओस्टेंसिक रूप से एक्सट्रोनस फ़ंक्शन कॉल का उपयोग करने के लिए मजबूर करता है, जो अपने आप में सर्वश्रेष्ठ आचरण जांच के अधीन है, लेकिन यह क्रिया (और बदसूरत) अभिव्यक्ति "(बूलियन 1 && - बूलियन 2) (बूलियन 2 और&- बूलियन 1) से बचा जाता है!" "!


-2

यदि उपयोग पैटर्न इसे सही ठहराता है, तो क्यों नहीं? जबकि आपकी टीम ऑपरेटर को तुरंत पहचान नहीं पाती है, समय के साथ। मनुष्य हर समय नए शब्द सीखता है। प्रोग्रामिंग में क्यों नहीं?

केवल सावधानी मैं बता सकता हूं कि "^" में आपके दूसरे बूलियन चेक के शॉर्ट सर्किट शब्दार्थ नहीं हैं। यदि आपको वास्तव में शॉर्ट सर्किट शब्दार्थ की आवश्यकता है, तो एक स्थिर उपयोग विधि भी काम करती है।

public static boolean xor(boolean a, boolean b) {
    return (a && !b) || (b && !a);
}

16
मुझे एक्सोर के साथ कोई भी छोटा चक्कर संभव नहीं दिखता है - आपको परिणाम का मूल्यांकन करने के लिए बी और बी दोनों को जानना होगा।
इलेमा

7
इसके अलावा, तर्कों का मूल्यांकन कॉल टाइम के रूप में किया जाएगा, इसलिए कोई भी शॉर्ट-सर्किटिंग नहीं होगी।
इरिक्कलेन

3
इसके अतिरिक्त, Xor को मशीन स्तर पर एकल ऑपरेशन होना चाहिए।
ओगरे Psalm33

आपको संभवतः शॉर्ट-सर्किट मूल्यांकन और आलसी मूल्यांकन के बीच अंतर को देखना चाहिए। शॉर्ट-क्यूरिट मूल्यांकन एक कोड शैली है जो कॉल को रोकता है जो अन्यथा रनटाइम त्रुटियों के परिणामस्वरूप होता है, जैसे कि शून्य द्वारा विभाजन। C में यह ´if (भाजक! = 0 && अंशांक / भाजक) ´ हो सकता है, जिसमें यह स्वयं शून्य द्वारा विभाजन को रोकने के लिए आलसी मूल्यांकन का उपयोग करता है। आपका उत्तर भी विशुद्ध रूप से सट्टा है।
मार्टिन

2
सच कहूँ तो, एक प्रोग्रामर एक फ़ंक्शन लिखता है xor, जो ठीक उसी तरह से करता है जैसे कि एक्सर ऑपरेटर करता है, लेकिन एक गोल चक्कर के तरीके से, मेरे दिमाग में (विशेष रूप से क्षमता के बारे में) एक प्रोग्रामर की तुलना में अधिक प्रश्न सामने लाएगा जो बस इस्तेमाल किया था ^
Stijn de Witt

-3

दो चर की तुलना करने के लिए ठीक है। हालांकि, यह कई तुलनाओं के साथ काम नहीं करता है।


-3

एक बिटवाइज़ ऑपरेटर के रूप में, xor इसे बदलने के लिए किसी भी अन्य साधनों की तुलना में बहुत तेज है। तो प्रदर्शन के लिए महत्वपूर्ण और स्केलेबल गणना, xor जरूरी है।

मेरी व्यक्तिपरक व्यक्तिगत राय: यह बिल्कुल निषिद्ध है, किसी भी उद्देश्य के लिए, बूलियन के लिए समानता (== या! =) का उपयोग करने के लिए। इसका उपयोग करना बुनियादी प्रोग्रामिंग नैतिकता और बुनियादी बातों की कमी दर्शाता है। कोई भी जो आपको उलझन में दिखता है ^ को बूलियन बीजगणित की मूल बातें पर वापस भेजा जाना चाहिए (मुझे "विश्वास की नदियों के लिए" यहाँ लिखने के लिए लुभाया गया था :))।


1
सिवाय इसके कि जेआईटी कीहोल (थोड़ा) अनुकूलन में बहुत अच्छा है, जैसे एक बूलियन अभिव्यक्ति को दूसरे के साथ बदलना।
डेविड लेपिक 17

1
इसके अलावा, ^ मुख्य रूप से बुलियन (तर्क) ऑपरेटर नहीं है, यह एक बिटवाइज़ ऑपरेटर है। यह पाठक को धीमा करने के लिए कहता है, क्योंकि साइन बग होने की संभावना है। यदि आप ^ के लिए उपयोग करते हैं! =, आप वास्तव में गड़बड़ करने जा रहे हैं यदि आप कभी भी सी में प्रोग्राम करते हैं। बिटवाइज़ ऑपरेटर्स आपके पाठकों के लिए एक संकेत हैं (जो आपके कोड को डीबग करते हैं, जिसमें आप धीमा हैं) और साइन त्रुटियों की तलाश करें। । और वे मुश्किल हो सकते हैं। उदाहरण के लिए, क्या आप जानते हैं कि जावा का% सही मोड्यूलो नहीं है, जैसे C या पायथन में? मेरे पास एक बार कोड का एक स्निपेट था जो C, जावास्क्रिप्ट और पायथन में समान था, लेकिन जावा में नहीं था।
डेविड लेपिक

6
यह कैसे उत्थान हुआ? जावा XOR में सबसे पहले और! = संकलित किया जाता है [ stackoverflow.com/a/4175512/202504acing(# उसी कोड), दूसरे समता और xor के लिए असेंबलर परीक्षण में भी एक ही सरल ऑपरेशन प्रत्येक। क्या आपके पास अपने बयान का समर्थन करने के लिए कोई संख्या है?
jmiserez

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