कैसे आए C # में सशर्त XOR
ऑपरेटर नहीं है ?
उदाहरण:
true xor false = true
true xor true = false
false xor false = false
कैसे आए C # में सशर्त XOR
ऑपरेटर नहीं है ?
उदाहरण:
true xor false = true
true xor true = false
false xor false = false
& | ^
) बनाम सशर्त ऑपरेटरों ( && ||
) का जिक्र कर रहा है । लेकिन आप सही कह रहे हैं (निश्चित रूप से), एक तार्किक XOR है ...
जवाबों:
C # में, सशर्त संचालक आवश्यक होने पर केवल अपने द्वितीयक ऑपरेंड को निष्पादित करते हैं ।
चूंकि XOR को दोनों मूल्यों की परिभाषा का परीक्षण करना चाहिए , एक सशर्त संस्करण मूर्खतापूर्ण होगा।
उदाहरण :
तार्किक और: &
- हर बार दोनों पक्षों का परीक्षण करता है।
तार्किक OR: |
- हर बार दोनों पक्षों का परीक्षण करें।
सशर्त और: &&
- केवल 2 पक्ष का परीक्षण करता है यदि 1 पक्ष सत्य है।
सशर्त या: ||
- केवल दूसरी तरफ का परीक्षण करें यदि 1 पक्ष गलत है।
सवाल थोड़ा पुराना है लेकिन ...
यह है कि इस ऑपरेटर को कैसे काम करना चाहिए:
true xor false = true
true xor true = false
false xor true = true
false xor false = false
यह है! = ऑपरेटर बूल प्रकार के साथ काम करता है:
(true != false) // true
(true != true) // false
(false != true) // true
(false != false) // false
तो जैसा कि आप देख रहे ^^
हैं कि मौजूदा के साथ बदल दिया जा सकता है!=
!=
इसके लिए काम करेंगे।
AND
और OR
जैसा कुछ भी नहीं है XOR
। या कम से कम हमें एहसास नहीं था !=
:) @EvilGreebo
तार्किक XOR ऑपरेटर है: ^
प्रलेखन: सी # ऑपरेटरों और ^ ऑपरेटर
^
, जब बूलियन ऑपरेंड के साथ प्रयोग किया जाता है , तो बूलियन ऑपरेटर होता है। "बूल ऑपरेंड के लिए, ^ ऑपरेटर असमानता ऑपरेटर के समान परिणाम की गणना करता है! ="। आप बिटवाइर-एक्सर पूर्णांक ऑपरेंड के साथ भी कर सकते हैं ^
। C # नहीं है C.
एक स्पष्टीकरण के रूप में, ^ ऑपरेटर अभिन्न प्रकार और बूल दोनों के साथ काम करता है।
MSDN के ^ ऑपरेटर देखें (C # संदर्भ) :
बाइनरी ^ ऑपरेटरों को अभिन्न प्रकार और बूल के लिए पूर्वनिर्धारित किया जाता है। अभिन्न प्रकारों के लिए, ^ अपने ऑपरेंड के बिटवाइज अनन्य-OR की गणना करता है। बूल ऑपरेंड के लिए, ^ तार्किक अनन्य-या उसके ऑपरेंड की गणना करता है; यही कारण है कि, परिणाम सच है अगर और केवल अगर उसके ऑपरेंड में से एक सच है।
हो सकता है कि यह सवाल पूछे जाने के बाद 2011 से प्रलेखन बदल गया हो।
^
पांच साल तक इस का उल्लेख और पूर्वसूचक करती है। मुझे संदेह है कि कुछ भी बदल गया है।
अरे हाँ, यह करता है।
bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
i1
बस एक बाइट की तरह है)। यह 100% परिभाषित और सुरक्षित प्रबंधित व्यवहार है। सीएलआर रफ-अप नहीं है ।; Microsoft Pex का उपयोग करते समय मैंने पहली बार यह व्यवहार देखा था।
सशर्त एक्सोर मौजूद नहीं है, लेकिन आप तार्किक का उपयोग कर सकते हैं क्योंकि एक्सर को बुलियन के लिए परिभाषित किया गया है, और सभी सशर्त तुलना बूलियन का मूल्यांकन करते हैं।
तो आप कुछ ऐसा कह सकते हैं:
if ( (a == b) ^ (c == d))
{
}
1
। यह थोड़ा ज्ञात तथ्य है। आप एक ऐसी स्थिति में समाप्त हो सकते हैं, जहां दो गैर-झूठे बूलियंस के एक्सर अभी भी गैर-झूठे हैं! इस विशेष कोड में कहा गया है कि xor ऑपरेटर केवल [0,1] में मूल्यों पर लागू होता है ताकि मेरी टिप्पणी पूरी तरह से लागू न हो।
&
कमजोर भी है।
&&
करते थे और संकलित करते थे जैसे कि यह &
एक गलत बयान है।
जबकि लॉजिकल एक्सोर ऑपरेटर है ^
, कोई सशर्त एक्सोर ऑपरेटर नहीं है। आप निम्नलिखित का उपयोग करके A और B दो मानों का एक सशर्त xor प्राप्त कर सकते हैं:
A ? (!B) : B
पैरेंस आवश्यक नहीं हैं, लेकिन मैंने उन्हें स्पष्टता के लिए जोड़ा।
जैसा कि द इविल ग्रीबो द्वारा बताया गया है, यह दोनों अभिव्यक्तियों का मूल्यांकन करता है, लेकिन एक्सोर को कम परिचालित नहीं किया जा सकता है और और या ।
0101 ^ 0011
मूल्य है 0110
।
सशर्त (शॉर्ट-सर्किटिंग) एक्सओआर जैसी कोई चीज नहीं है। सशर्त संचालक केवल तभी सार्थक होते हैं जब निश्चित रूप से केवल पहले तर्क को देखने से अंतिम परिणाम बताने का एक तरीका होता है। XOR (और जोड़) को हमेशा दो तर्कों की आवश्यकता होती है, इसलिए पहले तर्क के बाद शॉर्ट-सर्किट का कोई रास्ता नहीं है।
यदि आप A = true जानते हैं, तो (A XOR B) =! B
यदि आप A = गलत जानते हैं, तो (A XOR B) = B
दोनों ही मामलों में, यदि आप A को जानते हैं, लेकिन B को नहीं, तो आप पर्याप्त नहीं जानते (A XOR B)। उत्तर की गणना करने के लिए आपको ए और बी दोनों के मूल्यों को हमेशा सीखना चाहिए। शाब्दिक रूप से कोई उपयोग का मामला नहीं है जहां आप कभी भी दोनों मूल्यों के बिना XOR को हल कर सकते हैं।
ध्यान रखें, XOR परिभाषा के अनुसार चार मामले हैं:
false xor true = true
true xor false = true
true xor true = false
false xor false = false
फिर, उम्मीद है कि ऊपर से यह स्पष्ट है कि पहला मूल्य जानना कभी पर्याप्त नहीं है दूसरा उत्तर जानने के बिना भी उत्तर प्राप्त करने के लिए पर्याप्त नहीं है। हालाँकि, आपके प्रश्न में, आपने पहले मामले को छोड़ दिया। अगर आप इसके बजाय चाहते थे
false op true = false (or DontCare)
true op false = true
true op true = false
false op false = false
तब आप वास्तव में एक छोटी-परिचालित सशर्त ऑपरेशन द्वारा प्राप्त कर सकते हैं:
A && !B
लेकिन यह एक XOR नहीं है।
इस सवाल का उत्तर दिया गया है, लेकिन मैं एक अलग स्थिति में आया हूं। यह सच है कि सशर्त XOR की कोई आवश्यकता नहीं है। यह भी सही है कि ^ ऑपरेटर का उपयोग किया जा सकता है। हालांकि, यदि आपको केवल ऑपरेंड्स की "सही" झूठी "स्थिति का परीक्षण करने की आवश्यकता है तो ^ परेशानी पैदा कर सकता है।" उदाहरण के लिए:
void Turn(int left, int right)
{
if (left ^ right)
{
//success... turn the car left or right...
}
else
{
//error... no turn or both left AND right are set...
}
}
इस उदाहरण में, यदि बाईं ओर 10 (0xa) पर सेट किया गया है और दाईं ओर 5 (0x5) पर सेट किया गया है, तो "सफलता" शाखा में प्रवेश किया जाता है। इसके लिए (सरलीकृत अगर मूर्खतापूर्ण) उदाहरण है, तो यह बग के परिणामस्वरूप होगा क्योंकि आपको एक ही समय में बाएं और दाएं मुड़ना नहीं चाहिए। मैंने प्रश्नकर्ता से जो इकट्ठा किया, वह यह नहीं है कि वह वास्तव में एक सशर्त चाहता था, लेकिन मानों पर सही / गलत प्रदर्शन करने का एक सरल तरीका है जैसा कि एक्सर को दिया गया था।
एक मैक्रो कर सकता है चाल:
#define my_xor(a, b) ( ((a)?1:0) ^ ((b)?1:0) )
अगर मैं निशान से दूर हूँ तो मुझे बेझिझक थप्पड़ मारो: ओ)
मैंने यह पोस्ट करने के बाद नीचे jimreed का उत्तर पढ़ा (बुरा यापदोग!) और उसका वास्तव में सरल है। यह काम करेगा और मुझे इस बात का बिलकुल भी अंदाजा नहीं है कि उसका जवाब क्यों दिया गया ...
if
एक बूलियन अभिव्यक्ति की आवश्यकता है, यह एक इंट के साथ भी संकलित नहीं करेगा।
!=
विकल्प के रूप में कैसे काम करता है ?