2012-04-05 13 views
9

तो मुझे लगता है कि यह प्रश्न पहले से ही पूछा जा चुका है, हालांकि उत्तर थोड़ा अस्पष्ट और अनुपयोगी थे। ठीक है, मैं केवल का उपयोग कर एक सी अभिव्यक्ति लागू करने की आवश्यकता "&^~ + | >> < <!"बिटवाई ऑपरेटरों का उपयोग कर सशर्त वक्तव्य

अभिव्यक्ति के समान की जरूरत है: एक? ख: ग

तो, मैं क्या बता कर लिया है से, अभिव्यक्ति की तरह कुछ देखने के लिए की जरूरत है:

return (a & b) | (~a & c)

यह काम करता है जब एक = 0, क्योंकि ख के साथ anding यह दे देंगे शून्य, और फिर अभिव्यक्ति दाएं तरफ वापस आ जाएगी, (~a & c) जो काम करता है क्योंकि ~ 0 सभी को देता है, और सभी के साथ एंडिंग सी सी देता है।

हालांकि, यह काम नहीं करता है जब कोई> 0। क्या कोई यह समझाने की कोशिश कर सकता है कि यह क्यों है, या इसे कैसे ठीक किया जाए?

उत्तर

15

मैं एक बूलियन !!a का उपयोग करने के a बदल जाएगा, प्राप्त करने के लिए 0 या 1. x = !!a

तब मैं दो पूरक में अस्वीकार कर दूंगा। चूंकि आपके पास यूनरी माइनस उपलब्ध नहीं है, इसलिए आप 2 की पूरक अस्वीकृति की परिभाषा का उपयोग करते हैं: बिट्स को घुमाएं, फिर एक जोड़ें: y = ~x + 1। इससे सभी बिट्स स्पष्ट हो जाएंगे, या सभी बिट सेट होंगे।

तो मैं and चाहता हूं कि सीधे एक चर y & b के साथ, इसके विपरीत इसके विपरीत: ~y & c। यह अभिव्यक्तियों में से एक के लिए 0 और दूसरे के लिए मूल चर देगा। जब हम or एक साथ उन पर, शून्य का कोई प्रभाव नहीं पड़ेगा, इसलिए हमें मूल चर, अपरिवर्तित मिलेगा।

+0

यह वास्तव में सही है। तो क्यों एक जोड़ना थोड़ा सेट या साफ़ करता है? मैं समझता हूं कि ऐसा क्यों होना चाहिए, लेकिन मुझे नहीं पता कि यह कैसे होता है। – atb

+0

अगर हम 0 के साथ शुरू करते हैं, तो बिट्स को फ़्लिप करने से सभी को मिल जाता है। जब हम एक जोड़ते हैं, तो वे सभी शून्य पर वापस जाते हैं (और लेयर सेट हो जाता है, लेकिन हम इसे अनदेखा करते हैं)। अगर हम 1 से शुरू करते हैं, तो बिट्स को फिसलने से 111 ... 10 मिलता है। 1 जोड़ना जो पिछले 0 से 1 तक चलता है, इसलिए सभी बिट्स अब 1 हैं। –

+0

'y = ~ x + 1' भाग मुझे उलझन में मिला; आखिरकार मैंने यह पाया कि यह x = 0 के मामले में पूर्णांक ओवरफ़्लो के कारण काम करता है, लेकिन यह स्पष्ट नहीं है। मेरे लिए अधिक स्पष्ट समाधान पहली बार बाएं शिफ्ट (00000001 => 10000000) के साथ एमएसबी को एलएसबी में स्थानांतरित करना था और फिर सही शिफ्ट के साथ एमएसबी की प्रतिलिपि बनाना: 'y = (x << 31) >> 31' –

3

दूसरे शब्दों में, आप a जरूरत है सभी बिट्स 0 पर सेट है करने के लिए, अगर एक है false (अर्थात 0), और सभी बिट्स, 1 करने के लिए सेट किया है a सच है (अर्थात a > 0)।

पूर्व मामले के लिए, काम आपके लिए पहले से ही किया जा चुका है; उत्तरार्द्ध के लिए - ~!1 अभिव्यक्ति के परिणाम को बाहर करने का प्रयास करें।

+0

अच्छी तरह से मैंने पहले सोचा था। ~! 1 उन सभी को देगा जो सही हैं। हालांकि, अगर मैं ~ ए, और ए = 0 करना चाहता था, तो ~! 0 मुझे 1110 देगा, इसलिए मुझे यकीन नहीं है कि यहां से क्या करना है/ – atb

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