2011-11-02 10 views
21

संभव डुप्लिकेट:
What is the tilde (~) in a C# enumeration?एक अभिव्यक्ति में टिल्डे का मतलब क्या है?

मैं एक this MSDN पृष्ठ पर कोड की निम्न बिट पाया।

(((Width * Planes * BitCount + 31) & ~31)/8) * abs(Height) 

इस में संकलन वास्तव में है सी # दृश्य स्टूडियो 2010 वास्तव में टिल्ड है क्या "~" नंबर 31 के सामने कर? मैंने इस वाक्यविन्यास को पहले अभिव्यक्ति में कभी नहीं देखा है।

+2

इसका थोड़ा सा पूरक। नीचे दिए गए लिंक देखें। [कैसे बिटवाइस पूरक ऑपरेटर काम करता है] [1] [1]: भविष्य रेफरी के लिए http://stackoverflow.com/questions/791328/how-does-the-bitwise-complement-operator-work – Nerdtron

+0

यहां सी # ऑपरेटरों की सूची दी गई है। [सी # ऑपरेटर] (http://msdn.microsoft.com/en-us/library/6a71f45d.aspx) –

उत्तर

14

यह bitwise complement ऑपरेटर है, जिसे बिटवाईट अस्वीकृति भी कहा जाता है।

5

यह bitwise complement operator है।

असल में, यह बिट्स flips:

0xffff0000 == ~0x0000ffff 

कोड में आप पोस्ट किया है, कर & ~31 सुनिश्चित करता है पिछले 5 बिट्स 0 (बिटवाइज़ और 11111 के पूरक जो 00000 है की) कर रहे हैं।

36

~ - यह सिर्फ 1s में सभी 0 बिट्स बनाता है - bitwise NOT operator, मूल रूप से द्विपदीय प्रारूप में बिट्स को उलटने के

31 31 == 00000, मूल रूप से 0

+0

+1 क्योंकि यह समझने और साफ़ करने का सबसे आसान जवाब है। –

+5

उदाहरण सही नहीं है, क्योंकि अग्रणी शून्य भी उलटा हुआ है। अर्थात। '~ 31 = ~ 0x0000001F = 0xFFFFFFE0' – JimiLoe

+1

यह उदाहरण सही नहीं है 31 की दो पूरक बाइनरी 00000000000000000000000000011111 है (जो 0000001F हेक्स में है - यदि 32 बिट की गणना की जा रही है) और" ~ "ऑपरेटर बिट्स को फ़्लिप करता है, तो उत्तर 11111111111111111111111111100000 होगा , अगर हम दशमलव में कनवर्ट कर, जवाब -32 है 64 बिट, 31 की दो के पूरक बाइनरी 0000000000000000000000000000000000000000000000000000000000011111 है और "~" बिट्स flips, जो -32 के लिए फिर से बराबर है। AFAIK कोई 6 बिट पीसी नहीं है जो सी # चलाता है कि आपका गलत क्यों है। यदि कोई 6 बिट पीसी है, तो यह सही है। –

1

यह बिटवाइज़ पूरक ऑपरेटर है 11111 है, इसलिए ~ और इसके विपरीत ... MSDN reference देखें।

अपने विशिष्ट मामले में यह सिर्फ बनाता है (31 = 0x1F):

~0x1F = 0xFFFFFFE0 

यह bitwise and (&) साथ प्रयोग किया जाता है और इस प्रकार bascially यह पिछले 5 बिट्स बाहर रद्द।

0

~ 31 = 31 के और इस विशेष मामले में बिटवाइज़ निषेध पहले (से LSB) (Width * Planes * BitCount + 31)

7

के 5 बिट्स आप ISO/IEC 23270:2006 — Information technology — Programming languages — C# के अपने काम की नकल करने के लिए बारी शून्य और § 14.6 को चालू करने के लिए रखने के लिए प्रयोग किया जाता है। पवित्र लेखन के 4। वहाँ आप पाएँगे:


14.6.4 बिटवाइस पूरक ऑपरेटर

प्रपत्र ~ एक्स, एकल ऑपरेटर अधिभार संकल्प (§14.2.3) लागू किया जाता है की एक ऑपरेशन के लिए एक विशिष्ट ऑपरेटर को चुनने के लिए कार्यान्वयन। ऑपरेंड को चयनित ऑपरेटर के पैरामीटर प्रकार में परिवर्तित कर दिया जाता है, और परिणाम का प्रकार ऑपरेटर का रिटर्न प्रकार होता है। पूर्वनिर्धारित बिटवाइज़ पूरक ऑपरेटरों हैं:

int operator ~(int x) ; 
uint operator ~(uint x) ; 
long operator ~(long x) ; 
ulong operator ~(ulong x) ; 

इन ऑपरेटरों में से प्रत्येक के लिए, आपरेशन के परिणाम एक्स के बिटवाइज़ पूरक है।

E operator ~(E x); 

~x, जहां x एक अंतर्निहित प्रकार U के साथ एक गणना प्रकार E की अभिव्यक्ति है का मूल्यांकन का परिणाम है, बिल्कुल के रूप में एक ही है:

हर गणना प्रकार ई परोक्ष निम्नलिखित बिटवाइज़ पूरक ऑपरेटर प्रदान करता है unchecked((E)(~(U)x)) का मूल्यांकन। इस ऑपरेटर को केवल यूनरी ऑपरेटर ओवरलोड रिज़ॉल्यूशन द्वारा माना जाता है जब ऑपरेंड प्रकार enum प्रकार E (§14.2.3) होता है।

ऊपर परिभाषित किए गए पूर्वनिर्धारित पूर्वनिर्धारित बिटवाई पूरक पूरक ऑपरेटरों के लिफ्ट (§14.2.7) रूप भी पूर्वनिर्धारित हैं।


अपने मामले ~31 में ~ 0x0000001F के समान है। 0x0000001F की बिटवाई शिकायत 0xFFFFFFE0 है। वे सिर्फ वास्तविक मुखौटा क्यों नहीं लिखेंगे जो वे चाहते थे मेरे बाहर है।

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