मैं सी में एक झंडा कैसे निकाल सकता हूं?


148

एक चर है जो कुछ झंडे रखता है और मैं उनमें से एक को निकालना चाहता हूं। लेकिन मुझे नहीं पता कि इसे कैसे हटाया जाए।

यहां बताया गया है कि मैं झंडा कैसे स्थापित करता हूं।

my.emask |= ENABLE_SHOOT;

जवाबों:


339

संक्षिप्त जवाब

आप उस ध्वज के बिटवाइज़ नहीं संचालन के साथ वर्तमान मान पर एक बिटवाइज़ और ऑपरेशन करना चाहते हैं जिसे आप अनसेट करना चाहते हैं । एक बिटवाइज़ हर बिट को निष्क्रिय नहीं करता है (यानी 0 => 1, 1 => 0)।

flags = flags & ~MASK;या flags &= ~MASK;

लंबा जवाब

ENABLE_WALK  = 0    // 00000000
ENABLE_RUN   = 1    // 00000001
ENABLE_SHOOT = 2    // 00000010
ENABLE_SHOOTRUN = 3 // 00000011

value  = ENABLE_RUN     // 00000001
value |= ENABLE_SHOOT   // 00000011 or same as ENABLE_SHOOTRUN

जब आप एक बिटवाइज़ और बिटवाइज़ के साथ उस मूल्य का प्रदर्शन करते हैं जिसे आप परेशान करना चाहते हैं।

value = value & ~ENABLE_SHOOT // 00000001

आप वास्तव में कर रहे हैं:

      0 0 0 0 0 0 1 1     (current value)
   &  1 1 1 1 1 1 0 1     (~ENABLE_SHOOT)
      ---------------
      0 0 0 0 0 0 0 1     (result)

@ ऐरन: मुझे खुशी है कि इसने मदद की। मुझे शुरू में बिटवाइज़ ऑपरेशंस को समझने में दिक्कत हुई जब तक कि किसी को पेपर पर इसे समझाने में 10 मिनट नहीं लगे।
डेनिस

1
@ डेनिस ने सोचा कि XOR पहले से स्थापित झंडे को हटाने के लिए काम करेगा। notification.sound ^= Notification.DEFAULT_SOUND;
जैसे कि

3
आप वॉक को कैसे सक्षम करते हैं? चूंकि एक्स | 0 == X
यूनिकॉर्न

जैसा कि @ यूनिकॉर्न बताते हैं, शून्य का ध्वज मूल्य ठीक से काम नहीं करता है, या तो यदि आप इसे चालू करने की कोशिश करते हैं या यदि आप इसे करने की कोशिश करते हैं या इसे बंद कर देते हैं।
रेनीपेट

चलने को सक्षम करने के लिए, आपको बस रन को अक्षम करना होगा (जो कि 1 सेट को 0 पर सेट करेगा)। ENABLE_ * झंडे को दशमलव संख्याओं के रूप में न समझें, बल्कि बाइनरी संख्याओं के रूप में या तो बंद या बंद करें। हालाँकि आप अभी भी स्पष्ट रूप से चलना सक्षम या अक्षम नहीं कर सकते हैं ।
जैकब डीगलिंग


13

यह ध्यान रखना महत्वपूर्ण है कि यदि परिवर्तन किया जा रहा चर एक इंट से बड़ा है, तो 'और न' अभिव्यक्ति में उपयोग किया गया मान भी होना चाहिए। वास्तव में, कभी-कभी छोटे प्रकारों का उपयोग करने से कोई भी दूर हो सकता है, लेकिन पर्याप्त अजीब मामले हैं कि यह सुनिश्चित करने के लिए कि प्रत्यय पर्याप्त बड़े हैं, प्रकार के प्रत्ययों का उपयोग करना सबसे अच्छा है।


5
गैर-स्पष्ट कोने मामले को पकड़ने के लिए +1। इससे बचने का एक तरीका इसके बजाय flags -= flags & MY_FLAG;(या ^=यदि आप चाहें तो) का उपयोग करें।
R .. GitHub STOP हेल्पिंग ICE

1
@ आर .. मैंने '^ =' का इस्तेमाल किया होगा, सिवाय इसके कि बिट्स टॉगल करेंगे और कभी-कभी आपको नहीं पता होगा कि कौन से झंडे सेट हैं। अगर मैं यह सुनिश्चित करना चाहता हूं कि दो सही बिट्स शून्य हैं, जैसे my.emask: '0 1 0 1' इनपुट: '0 0 1 1' के साथ: '^ =' '0 1 1 0' साथ: '& ~ '' 0 1 0 0 ''
हेक्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.