बिटवाइज़-या बनाम झंडे जोड़ना


16

मैंने देखा है कि दूसरों ने पहले झंडे को संयोजित करने के लिए Bitwise-OR का उपयोग किया है:

#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04

const byte madPerson = RUN | JUMP | SHOOT;

मैं भी यही करता हूं।

लेकिन मैंने भी कुछ (बहुत सारे नहीं) झंडे जोड़ कर देखे हैं:

#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04

const byte madPerson = RUN + JUMP + SHOOT;

कौन सा अधिक "पठनीय" है? (कौन सा आपको लगता है कि अधिक लोग पहचान लेंगे?) इसे करने के लिए "मानक" तरीका क्या है? तुम्हें कौन सा पसंद है?


यह एक SO प्रश्न है। की तरह कुछ उपयोग पर विचार करें 1<<0, 1<<1, 1<<2, और इतने पर। जब आपके पास कई झंडे होते हैं, तो यह अधिक पठनीय, अधिक बनाए रखने योग्य, कम त्रुटि-प्रवण हो जाता है। उदाहरण के लिए, यदि आप 64 बिट के सभी 64 बिट इंटों को पैक कर रहे हैं, तो आप वास्तव में टाइपो से बचना चाहते हैं :) आप किस तरह से प्रतिनिधित्व करते हैं 1यह भी महत्वपूर्ण है। VS2010 में 64 बिट पूर्णांक के लिए मुझे लगता है कि यह 1UI64या ऐसा ही कुछ है। एक गलत प्रकार का उपयोग करना आपको काट सकता है।
जॉब

3
@ जॉब: स्टैकऑवरफ्लो प्रश्न नहीं, क्योंकि यह पठनीयता, पहचान, प्राथमिकताएं और सर्वोत्तम प्रथाओं के बारे में पूछ रहा है। इसके लिए कोई एकल वस्तुनिष्ठ उत्तर नहीं; यह यहाँ है।
मैक्नील

जवाबों:


34

बिटवाइज़-या।

जोड़ खतरनाक है।

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

#define PERSON 1 << 0
#define SPEAKS 1 << 1
#define SHOOTS 1 << 2
#define INVINCIBLE 1 << 3
const byte bandit = PERSON | SHOOTS;                    // 00000101
const byte angryBandit_add = bandit + SPEAKS + SHOOTS;  // 00001011 error
const byte angryBandit_or = bandit | SPEAKS | SHOOTS;   // 00000111 ok

यदि आप angryBandit_addअपने खेल का उपयोग करते हैं, तो अब उन नाराज डाकुओं के बारे में भयावह तर्क त्रुटि होगी जो गोली नहीं मार सकते या मारे नहीं जा सकते।

यदि आपने angryBandit_orसबसे खराब इस्तेमाल किया है तो आप एक बेमानी है | SHOOTS

इसी तरह के कारणों के लिए, बिटवाइज़ फ़्लैग हटाने के लिए घटाव से अधिक सुरक्षित नहीं है।


11

बिटवाइज-या इरादे को और अधिक स्पष्ट रूप से बताती है

इसके अलावा, बिटवाइज़-ओर अधिक कुशल होना चाहिए


+1 वास्तव में मुझे यह भी लगता है कि या यह अधिक स्पष्ट है कि वे झंडे हैं, लेकिन दक्षता के संबंध में ऐसी भाषाएं हैं जहां बिटवाइज़ संचालन धीमा है, उदाहरण के लिए जावास्क्रिप्ट सभी संख्याएँ 64 फ़्लोट्स बिटवाइज़ ऑपरेटरों को उन पर अंतर्निहित रूपांतरण करने की आवश्यकता है।
Ivo वेटजेल

1
ओपी के उदाहरण को देखते हुए, मुझे नहीं लगता कि ओआरएस या जोड़ की एक पंक्ति किसी प्रोग्राम की निष्पादन गति पर प्रतिकूल प्रभाव डालने वाली है।
टिन मैन

1
@Greg: विशेष रूप से उस उदाहरण में गणना संकलन समय पर की जाएगी। :-)
कार्सन ६३००० ५’१०

इरादे से अवगत कराने के अलावा, यह कई भाषाओं में देखने के लिए काफी आम है, जिसमें एडीए, सी #, जावा तक सीमित नहीं है ...
केन हेंडरसन

2
इस व्यवसाय में "चाहिए" एक बहुत बड़ा शब्द है। हालांकि यह अत्यधिक संभावना नहीं है कि आप आज इस मुद्दे का सामना करेंगे, मेरे पास एक प्रोसेसर पर काम करने की बहुत स्पष्ट यादें हैं जिनके पास बिटवाइज़-या निर्देश नहीं था। आप एक निर्देश में बिटवाइज़-एंड कर सकते हैं, और आप एक निर्देश में बिटवाइज़-एक्सओआर कर सकते हैं, लेकिन बिटवाइज़-ऑर ने दो ले लिए: बिट को बंद करने के लिए एक तत्काल बिटवाइज़-एंड, और नए बिट को पूरक करने के लिए एक तत्काल बिटवाइज़-एक्सओआर। , जो निश्चित रूप से इसे निर्धारित करते हैं।
जॉन आर। स्ट्रोह डे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.