2009-12-09 14 views
11

मेरे सिर के ऊपर से, मैं एक ऐसी भाषा के बारे में नहीं सोच सकता जिसका मैंने उपयोग किया है जिसमें तार्किक अनन्य या ऑपरेटर था, लेकिन सभी के पास तार्किक और bitwise and और or ऑपरेटर हैं।क्यों कई भाषाओं में लॉजिकल एक्सओआर ऑपरेटर की कमी है?

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

बस बिटवाई एक्सओआर का उपयोग करना या तो काम नहीं करता है, क्योंकि यह एक अलग परिणाम देगा।

0b0001^0b1000 = 0b1001 (True) 
0b0001 XOR 0b1000 = False 
// Where^is bitwise exclusive or and XOR is logical exclusive or 
// Using != (not equal to) also doesn't work 
0b0001 != 0b1000 = True 

तो क्यों अधिकांश भाषाओं में तार्किक अनन्य या ऑपरेटर शामिल नहीं है?

संपादित: मैं कैसे != भी जो मैं चाहता भी नहीं करता है के साथ एक उदाहरण जोड़ा, यह लगभग करता है, लेकिन एक ही समस्या यह है कि बिटवाइज़ विशेष का उपयोग कर या क्या करता है में गिर जाता है, यह केवल काम करता है अगर आप आप जानते हैं शून्य या एक के साथ काम कर रहे हैं, और कोई अन्य नंबर नहीं।

और ध्यान दें, यह माना जाता है कि भाषा शून्य के रूप में शून्य और गैर-शून्य के रूप में उपयोग करती है।

+0

आपके दूसरे उदाहरण में, यह एक ऐसी भाषा मानता है जो सत्य के लिए गैर-शून्य का उपयोग करता है। – caskey

+1

क्या आप एक उदाहरण दे सकते हैं कि आपका लॉजिकल एक्सओआर बराबर से अलग कैसे है? –

+2

* असली * यहां है "आप गैर-बुलियन मूल्यों पर लॉजिकल ऑपरेटरों का उपयोग करने का प्रयास क्यों कर रहे हैं?" यह शुरू करने के लिए अर्थपूर्ण रूप से अमान्य और खराब प्रोग्रामिंग अभ्यास है। – RBarryYoung

उत्तर

3

ठीक है, ताकि आप एक बाइट बुद्धिमान अनन्य या बनाम एक बिट बुद्धिमान अनन्य या के लिए देख रहे हैं। ऐसा लगता है कि आप ऐसा कुछ ढूंढ रहे हैं जो बाइट पर "चालू" या "ऑफ" के रूप में काम करेगा, जैसा कि बाइट्स "0" या "nonzero" हैं, फिर उन्हें एक्सओआर करें। यह वास्तव में लगता है जैसे आप प्रत्येक बाइट को एक बिट में संपीड़ित करना चाहते हैं जो सच या गलत दर्शाता है। तो, ऐसा लगता है जैसे आप चाहते हैं (ए! = 0)^(बी!= 0)

 
a b a YOURXOR b a!=0 b!=0 (a!=0)^(b!=0) 
0 0   0   0  0  0   
0 1   1   0  1  1 
1 0   1   1  0  1 
7 0   1   1  0  1 
0 7   1   0  1  1 
3 7   0   1  1  0 
7 3   0   1  1  0 
7 7   0   1  1  0 

क्यों यह हर भाषा में क्यों नहीं है ... कि मैं वास्तव में जवाब नहीं दे सकता। हालांकि, प्रत्येक भाषा में उपलब्ध बिटवाईयर xor के बिल्डिंग ब्लॉक के साथ कार्यान्वित करना मुश्किल नहीं है, और कोई भी भाषा सभी संभावित कार्यक्षमता प्रदान नहीं करती है - वे केवल आपको विस्तारित कार्यक्षमता बनाने के लिए पर्याप्त पेशकश करते हैं। ओह, और यदि यह एक लोकप्रिय पर्याप्त समस्या थी, तो आप इसके लिए जगह पर पुस्तकालयों या मैक्रोज़ देखने की उम्मीद करेंगे; जबकि मैंने इस तरह के libs/कोड के लिए पर्याप्त खोज नहीं की हो, मुझे कोई भी नहीं मिला, यह दर्शाता है कि आवश्यकता या तो लिखने के लिए तुच्छ है, या एक विशिष्ट आवश्यकता है।

+2

मुझे लगता है! एक ^! ​​बी भी काम करता है। विशेष रूप से यह रूबी में काम करता है '! X' एक बूल –

3

एकमात्र कारण मैं सोच सकता हूं कि ऑपरेशन अपेक्षाकृत दुर्लभ है। मुझे नहीं लगता कि क्यों ^^ जैसे कुछ को असाइन नहीं किया जा सकता है, हालांकि, जो लोग भाषाएं डिजाइन करते हैं वे ऑपरेटर अव्यवस्था से बचना चाहते हैं।

यह बेकार है क्योंकि इसे शॉर्ट-सर्किट नहीं किया जा सकता है, कई दृढ़ता से टाइप की गई भाषाओं में आप बैकवाइंड एक्सओआर ऑपरेटर का उपयोग बिना बुलियन के तुलना में बूलियन की तुलना करने के लिए नहीं कर सकते हैं, इस मामले में भी एक गैर-शॉर्ट सर्किटिंग तार्किक एक्सओआर समझ में आता है।

1

शायद क्योंकि XOR सामान्यतः एक तार्किक ऑपरेटर के रूप में की जरूरत है नहीं, और आप इस के रूप में लगभग के रूप में आसानी से कर सकते हैं:

// foo xor bar 
(foo & !bar) || (bar & !foo) 

// or like this (assuming foo and bar are booleans) 
!(foo==bar) 

// assume boleans that can be cast as integers with true=1 and false=0 
// foo XOR bar XOR baz XOR alice 
((int)foo + (int)bar + (int)baz + (int)alice)&0b1 
+0

हालांकि यह तीन या चार परीक्षणों के लिए जटिल हो जाएगा। –

+0

हाँ, लेकिन यह उन चीजों में से एक है जो भाषा डिजाइनरों के लिए पर्याप्त दुर्लभ नहीं है। अच्छे उत्तर के लिए – MadCoder

17

लगभग हर भाषा एक तार्किक XOR है। उनके द्वारा उपयोग किए जाने वाले प्रतीक में भिन्नता है, लेकिन प्रतीक के बावजूद, अधिकांश लोग इसे "बराबर नहीं" कहते हैं।

संपादित करें: जो लोग शक तीन चर के लिए, परीक्षण कोड के लिए:

#include <iostream> 

int main() { 
    for (int i=0; i<2; i++) 
     for (int j=0; j<2; j++) 
      for (int k=0; k<2; k++) { 
       std::cout << "\n!=" << (i!=j!=k); 
       std::cout << "\t^ " << (i^j^k); 
      } 
    return 0; 
} 
+0

+0.5। उचित snarkiness के लिए +0.5। –

+9

यदि आप एक बूलियन संदर्भ की गारंटी नहीं दे सकते हैं, तो वह सूक्ष्म बग मांग रहा है। –

+2

अधिकांश भाषाओं में थोड़ा सा XOR है, लेकिन ** तार्किक ** एक नहीं है। टॉव ऑपरेशंस के मामले में "बराबर नहीं" काम करता है, लेकिन मुझे नहीं लगता कि एक! = बी! = सी एक्सओआर बी एक्सओआर सी के बराबर है। – MadCoder

5

क्या आप "तार्किक XOR ऑपरेटर" द्वारा मतलब है? मुझे यकीन है कि क्या परिणाम आप अपने उदाहरण से उम्मीद करते हैं नहीं कर रहा हूँ, लेकिन यहाँ मेरा उत्तर है:

a (logical XOR) b रूप bool(a) != bool(b)

असमानता एक तार्किक XOR है एक ही है। चूंकि आपके पास पहले से थोड़ा सा XOR संस्करण है, इसलिए आपको तार्किक के लिए एक विशेष ऑपरेटर की आवश्यकता नहीं है।

5

आप लॉजिकल xor के समान प्रभाव प्राप्त करने के लिए !a^!b भी लिख सकते हैं।

आप शायद प्रोग्रामिंग भाषाओं में तार्किक XOR नहीं मिल रहा है क्योंकि:

  • यह बहुत ही कुशल विधानसभा कोड उत्पन्न नहीं करता है
  • बहुत बार की जरूरत नहीं है
  • भाषा डिजाइनरों लाइन डालने के लिए है कहीं, NAND, NOR, NXOR, आदि क्यों नहीं
+0

+1 है क्योंकि मुझे पसंद है कि रेखा को कुछ बिंदु रेखा खींचना है – mikek3332002

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