2008-10-02 17 views
135

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

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

से

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

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

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

उत्तर

272

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

+34

*" क्या साथ! = "* गलत है' bool1^bool2^bool3' अधिक तार्किक भावना मेरे लिए की तुलना में 'bool1! = Bool2 बनाता है! = Bool3' –

+3

मेरे मस्तिष्क दर्द होता है। तो कर सकते हैं! = गलत परिणाम उत्पन्न करते हैं या नहीं? – vemv

+24

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

12

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

-1

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

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

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

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

+7

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

+3

इसके अतिरिक्त, मशीन स्तर पर xor एक ही ऑपरेशन होना चाहिए। –

26

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

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

+2

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

6

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

if (term1^term2) { ... 

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

16

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

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

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

-3

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

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

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

if(boolean1 != boolean2) 
{ 
    //do it 
} 
-3
str.contains("!=")^str.startsWith("not(") 

str.contains("!=") != str.startsWith("not(") 
-3

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

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

+1

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

+1

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

+5

यह कभी कैसे ऊपर उठाया गया? सबसे पहले, जावा एक्सओआर और! = संकलित किए गए हैं [http://stackoverflow.com/a/4175512/202504] (सटीक उसी कोड तक), समानता और xor के लिए असेंबलर परीक्षण में भी दूसरा एक सरल ऑपरेशन है। क्या आपके पास अपने बयान का बैक अप लेने के लिए कोई संख्या है? – jmiserez

5

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

flags = flags^MASK; 

This लेख Vipan सिंगला द्वारा विस्तार से अधिक उपयोग मामला बताते हैं।

यदि आपको अपने उदाहरण के रूप में बिटवाई एक्सओआर का उपयोग करने की आवश्यकता है, तो टिप्पणी करें कि आप इसका उपयोग क्यों करते हैं, क्योंकि इसके बारे में समझने के लिए कि आप इसका उपयोग क्यों कर रहे हैं, उनके ट्रैक में रुकने के लिए थोड़ा सा साक्षर दर्शकों की आवश्यकता होती है।

8

तुम हमेशा बस इसे एक समारोह में लपेट यह एक वर्बोज़ नाम देने के लिए कर सकते हैं:

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

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

आप use XOR to swap the values in two variables without using a third temporary variable भी कर सकते हैं।

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

यहां एक Stackoverflow question related to XOR swapping है।

-1

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

यदि मैं आपकी स्थिति में था (एक टीम में काम कर रहा था), तो मैं "बूलियन 1^बूलियन 2" तर्क को एक वर्णनात्मक नाम जैसे "isDifferent (boolean1, boolean2)" के साथ एक समझौते पर एक समझौता करता हूं।

उदाहरण के लिए

, "boolean1^boolean2" उपयोग करने के बजाय, आप "isDifferent (boolean1, boolean2)" कहेंगे तो जैसे:

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

आपका "isDifferent (boolean1, boolean2)" समारोह की तरह लग रहे हैं :

private boolean isDifferent(boolean1, boolean2) 
{ 
    return boolean1^boolean2; 
} 
बेशक

, इस समाधान (boolean1 एक जाहिरा तौर पर बाहरी समारोह कॉल, जो अपने आप में उत्तम आचरण संवीक्षा के अधीन है के उपयोग जरूरत पर जोर देता है, लेकिन यह अत्यधिक शब्द (और बदसूरत) अभिव्यक्ति से बचा जाता है "& & boolean2!) | | (Boolean2 & &! Boolean1) "!

संबंधित मुद्दे

 संबंधित मुद्दे