बिटलेवल ऑपरेटरों का नुकसान।
तुम पूछो:
"ऐसा कोई कारण बिटवाइज़ ऑपरेटर्स का उपयोग नहीं है &
, |
और ^
सी में bool" मूल्यों ++ के लिए "? ”
हां, लॉजिकल ऑपरेटर्स , जो बिल्ट-इन उच्च स्तरीय बुलियन ऑपरेटर हैं !
, &&
और ||
, निम्नलिखित लाभ प्रदान करते हैं:
गारंटी तर्कों के रूपांतरण के लिए bool
करने के लिए, यानी 0
और 1
क्रमसूचक मूल्य।
अंतिम परिणाम ज्ञात होते ही शॉर्ट सर्किट मूल्यांकन की गारंटी जहां अभिव्यक्ति मूल्यांकन बंद हो जाता है।
इसे ट्री-वैल्यू लॉजिक के रूप में व्याख्या की जा सकती है, जिसमें ट्रू , फाल्स और इंडिर्मनेट है ।
पठनीय पाठ समतुल्य not
, and
और or
, भले ही मैं उन्हें खुद का उपयोग नहीं करता।
एक टिप्पणी में पाठक एंटीमनी नोट्स भी bitlevel ऑपरेटरों विकल्प टोकन राशि के रूप में अर्थात् bitand
, bitor
, xor
और compl
, लेकिन मेरी राय में इन से भी कम समय पढ़े जाने योग्य हैं and
, or
और not
।
सीधे शब्दों में कहें, तो उच्च स्तरीय ऑपरेटरों का प्रत्येक लाभ बिटवेल ऑपरेटरों का नुकसान है।
विशेष रूप से, चूंकि बिटकॉइन ऑपरेटरों को तर्क रूपांतरण की कमी होती है 0/1 पर आपको उदाहरण मिलता है 1 & 2
→ 0
, जबकि 1 && 2
→ true
। इसके अलावा ^
, बिटवाइस एक्सक्लूसिव या, इस तरह से दुर्व्यवहार कर सकता है। बूलियन मूल्यों के रूप में माना जाता है 1 और 2 एक ही हैं, अर्थात् true
, लेकिन बिटपैटन के रूप में माना जाता है कि वे अलग हैं।
कैसे तार्किक व्यक्त करने के लिए / या C ++ में।
आप प्रश्न के लिए पृष्ठभूमि की एक बिट प्रदान करते हैं,
"मैं कभी-कभी उन स्थितियों में भाग लेता हूं जहां मैं चाहता हूं कि दो स्थितियों में से एक सही हो (XOR), इसलिए मैं सिर्फ ^ ऑपरेटर को सशर्त अभिव्यक्ति में फेंक देता हूं।"
वैसे, तार्किक ऑपरेटरों की तुलना में बिटवाइज़ ऑपरेटरों की उच्च प्राथमिकता होती है। इसका मतलब है कि विशेष रूप से मिश्रित अभिव्यक्ति में
a && b ^ c
आपको शायद अप्रत्याशित परिणाम मिले a && (b ^ c)
।
इसके बजाय बस लिखें
(a && b) != c
अधिक स्पष्ट रूप से व्यक्त करने का क्या मतलब है।
एकाधिक तर्क के लिए / या कोई C ++ ऑपरेटर नहीं है जो काम करता है। उदाहरण के लिए, यदि आप लिखते हैं a ^ b ^ c
तो यह एक अभिव्यक्ति नहीं है जो कहती है "या तो a
, b
या c
सच है"। इसके बजाय यह कहता है, "एक विषम संख्या a
, b
और c
सच है", जो उनमें से 1 या सभी 3 हो सकता है ...
सामान्य को या तो व्यक्त करने के लिए / या कब a
, b
और c
प्रकार के हैं bool
, बस लिखें
(a + b + c) == 1
या, गैर- bool
तर्कों के साथ , उन्हें इसमें कनवर्ट करें bool
:
(!!a + !!b + !!c) == 1
&=
बूलियन परिणाम जमा करने के लिए उपयोग करना ।
आप आगे बताते हैं,
"मैं भी कभी कभी बूलियन मान जमा करने के लिए की जरूरत है, और &=
और |=?
बहुत उपयोगी हो सकता है।"
खैर, यह जाँच करने के लिए मेल खाती है कि क्या क्रमशः सभी या किसी भी स्थिति से संतुष्ट हैं, और डी मॉर्गन का कानून आपको बताता है कि एक से दूसरे में कैसे जाना है। यानी आपको केवल उनमें से एक की जरूरत है। आप *=
एक सिद्धांतकार के रूप में उपयोग कर सकते हैं &&=
(अच्छे पुराने जॉर्ज बोले की खोज के लिए, तार्किक और बहुत आसानी से गुणन के रूप में व्यक्त किया जा सकता है), लेकिन मुझे लगता है कि वह कोड के प्रति चिंतित और शायद गुमराह करेगा।
इस पर भी विचार करें:
struct Bool
{
bool value;
void operator&=( bool const v ) { value = value && v; }
operator bool() const { return value; }
};
#include <iostream>
int main()
{
using namespace std;
Bool a = {true};
a &= true || false;
a &= 1234;
cout << boolalpha << a << endl;
bool b = {true};
b &= true || false;
b &= 1234;
cout << boolalpha << b << endl;
}
दृश्य C ++ 11.0 और g ++ 4.7.1 के साथ आउटपुट:
सच
असत्य
परिणामों में अंतर का कारण यह है कि बिटवेल अपने दाएं हाथ के तर्क में &=
रूपांतरण प्रदान नहीं करता bool
है।
तो, आप इन परिणामों में से किसके उपयोग की इच्छा रखते हैं &=
?
यदि पूर्व, true
तब बेहतर रूप से एक ऑपरेटर (जैसे ऊपर) या नामित फ़ंक्शन को परिभाषित करता है, या दाहिने हाथ की ओर अभिव्यक्ति का एक स्पष्ट रूपांतरण का उपयोग करता है, या पूर्ण में अपडेट लिखता है।