2013-04-17 4 views
11

if ((a & b) == b) निम्नलिखित कोड ब्लॉक में क्या मतलब है?सी # में इस कथन का क्या अर्थ है?

if ((e.Modifiers & Keys.Shift) == Keys.Shift) 
{ 
    lbl.Text += "\n" + "Shift was held down."; 
} 

ऐसा क्यों नहीं है?

if (e.Modifiers == Keys.Shift) 
{ 
    lbl.Text += "\n" + "Shift was held down."; 
} 
+4

Google 'bitwise और', फिर Google' bit flag' शामिल है। – mbeckish

+0

संभावित डुप्लिकेट [एक एकल क्या करता है | या मतलब है?] (http://stackoverflow.com/questions/9736751/what-does-a-single-or-mean) –

उत्तर

17

यदि आप Keys enum देखें, तो यह flag enum[FlagsAttribute] विशेषता के साथ है।

एक गणना के लिए केवल फ्लैगएट्रिब्यूट कस्टम विशेषता का उपयोग करें, यदि एक बिटवाईर ऑपरेशन (AND, OR, विशिष्ट या) को संख्यात्मक मान पर किया जाना है।

दो, यानी, 1, 2, 4, 8, और इसी तरह की शक्तियों में गणना स्थिरांक परिभाषित करें। इसका मतलब है कि संयुक्त गणना स्थिरांक में व्यक्तिगत झंडे ओवरलैप नहीं होते हैं।

Keys.Shift : 001 (1) 
Keys.Cancel : 010 (2) 
Keys.Enter : 100 (4) 

तो:

e.Modifiers = Keys.Shift | Keys.Cancel | Keys.Enter equal 001 | 010 | 100 = 111 

अवधारणा समझाने के लिए

e.Modifiers = Keys.Shift | Keys.Cancel | Keys.Enter 

बस बहुत आसान धारणा:

तो e.Modifiers एक से अधिक enum का एक संयोजन हो सकता है और हालत:

e.Modifiers & Keys.Shift equal 111 & 001 = 001 

इसका मतलब है:

e.Modifiers & Keys.Shift == Keys.Shift 

अगर e.Modifiers नहीं शामिल करता Keys.Shift:

e.Modifiers = Keys.Cancel | Keys.Enter (110) 

तो परिणाम होगा:

e.Modifiers & Keys.Shift equals 110 & 001 = 000 (is not Keys.Shift) 

अप नाबदान करने के लिए, इस हालत चादर की जांच करता है er e.Modifiers में Keys.Shift या

+1

'010 और 001' बराबर' 0' –

+0

@ मैटबुरलैंड: इंगित करने के लिए धन्यवाद, संपादित –

3

एक एकल एम्परसैंड (&) एक बिटवाइज़ है और, तो यह मूल रूप से (एक & ख) मान जोड़ रहा है और उसके बाद में (एक & ख) == समानता के लिए परीक्षण ख

तो आपके उदाहरण में, यह मूल रूप से कह रहा है कि शिफ्ट कुंजी दबाया जाता है (कोई भी कुंजी + शिफ्ट) == शिफ्ट।

+2

यह उन्हें जोड़ नहीं रहा है! Bitwise और ऑपरेटर और जोड़ने के बीच एक ** विशाल ** अंतर है। – antonijn

+0

हां, मुझे यह एहसास है। मैं बस इसे सरल तरीके से समझाने की कोशिश कर रहा था। अपमान करने के लिए खेद है। –

5

यह बूलियन तर्क (= "bitwise और") है। आप जांचते हैं कि चर में कोई मान है या नहीं। यह एक फिल्टर की तरह है।

उदाहरण:

a -> 00110011 
b -> 00000011 
a&b -> 00000011 

अपने कोड

if ((e.Modifiers & Keys.Shift) == Keys.Shift) 

जाँच करता है कि Keys.Shift e.Modifiers में निहित है में।

4

एक एकल एम्पर्सेंड bitwise AND operator को संदर्भित करता है। जब एक enum के संयोजन के साथ प्रयोग किया जाता है जिसमें [Flags] विशेषता है, जो Keys enum करता है, तो इसका उपयोग यह निर्धारित करने के लिए किया जाता है कि उस enum के बिट्स सेट है या नहीं।

एक से अधिक संशोधित कुंजी एक साथ दबाया जा सकता है, इसलिए इसका उपयोग प्रत्यक्ष तुलना के बजाय किया जाता है।

आप enum झंडे here के बारे में अधिक पढ़ सकते हैं। "बिट ध्वज के रूप में गणना प्रकार" नामक उपधारा में नीचे स्क्रॉल करें। आप एक नमूना देखेंगे जो इस तरह के समान है।

3

& पर enums और बिटवाइज़ संचालन पर पढ़ने के लिए बिटवाइज़ और ऑपरेटर है। यह क्या कर रहा है Keys एक ध्वज enum है, Keys में मान कई मूल्यों का थोड़ा सा संयोजन हो सकता है। तो किसी भी विशेष मूल्य के लिए पहले परीक्षण करें और उस मूल्य के साथ अपना मूल्य जिसे आप परीक्षण करना चाहते हैं और उसके बाद उस मूल्य की तुलना करें जिसका आप परीक्षण करना चाहते हैं।

उदाहरण के लिए, आप दोनों पारी और नीचे आयोजित Ctrl कुंजी है, तो e.Modifier में मूल्य Keys.Shift और Keys.Ctrl के बिटवाइज़ संयोजन होगा हो सकता है। तो यह:

e.Modifier == Keys.Shift 

गलत है। शिफ्ट दबाया जाता है, लेकिन Ctrl भी दबाया जाता है। यदि आप जानना चाहते हैं कि क्या अन्य कुंजियों को दबाए बिना शिफ्ट को दबाया गया है, तो आपको पहले सभी अन्य कुंजी को फ़िल्टर करने की आवश्यकता है।यह आसानी से एक फिल्टर के रूप Keys.Shift का उपयोग करके किया जाता है:

(e.Modifier & Keys.Shift) == Keys.Shift 

यह अब सच हो सकता है अगर shift कुंजी और झूठे दबाया जा सकता है अन्य कुंजियों अन्यथा की परवाह किए बिना नीचे रखा जाता है।

3

भाग 1

यह तर्क AND ऑपरेटर है।

इसका उपयोग करके कई झंडे उदाहरण पूर्णांक के लिए एक में settable होना चाहिए है:

उदाहरण के लिए

एक 3 जो द्विआधारी संकेतन में 00,000,011 का मतलब है। उदाहरण के लिए बी 2 है जिसका मतलब है बाइनरी नोटेशन में 00000010।

आप अगर एक झंडा (दाएं से दूसरे बिट) जो ख आप AND ऑपरेटर का उपयोग सेट का प्रतिनिधित्व करता है की जाँच करना चाहते हैं:

एक & ख = 00000010

और जब यह ख के बराबर होती है (या है> 0) आप जानते हैं कि ध्वज सेट है।

भाग 2

बराबर ऑपरेटर भी मामले आप यदि "Keys.Shift" केवल "आपरिवर्तक" कुंजी है और कोई अन्य एक दबाया जाता है जाँच करना चाहते हैं के लिए इस्तेमाल किया जा सकता है। जब आप पहले कोड का उपयोग करते हैं तो अन्य "संशोधक" कुंजी दबाए जा सकते हैं, और यदि स्थिति अभी भी सत्य होगी।

3

एक एकल एम्परसैंड (&) थोड़ा-सा और संचालन करता है; एक डबल एम्पर्सेंड (& &) एक बुलियन और ऑपरेशन करता है।

एक बिट-वार और दोनों तर्कों के प्रत्येक बिट पर एक और संचालन करता है (इसलिए इसे "बिट-वार" कहा जाता है)। इस प्रकार एक बिट-वार और ऑपरेशन (या किसी भी बिट-वार ऑपरेशन) का आउटपुट बुलियन वैल्यू नहीं होगा। यहाँ बिट-वार के कुछ उदाहरण और संचालन कर रहे हैं:

1001 & 0001 = 0001 
1101 & 1111 = 1101 

बूलियन और दो बूलियन मूल्यों पर चल रही है और रिटर्न एक बूलियन:

true && true = true 
false && true = false 

लघु सर्किटिंग
बूलियन और आपरेशन (& &) दो अभिव्यक्तियों पर भी किया जा सकता है जो एक बूलियन मान लौटाते हैं:

int a = 5; 
int b = 10; 
bool result = (a < 3) && (b > 3); 
// result will be false; 

क्योंकि पहली अभिव्यक्ति (a < 3)false को मूल्यांकन करता है, परिणाम संभवतः नहीं हो सकता true क्योंकि दोनों भाव true होने के लिए परिणाम के लिए क्रम में true करने का मूल्यांकन करने के लिए है। इस वजह से, दूसरी अभिव्यक्ति का भी मूल्यांकन नहीं किया जाएगा। इसे "शॉर्ट सर्किटिंग" कहा जाता है। हालांकि, थोड़ा-सा और ऑपरेशन के साथ, ऑपरेशन करने से पहले दोनों अभिव्यक्तियों का मूल्यांकन किया जाना चाहिए। इस प्रकार अधिकांश स्थितियों में जहां आप बस यह निर्धारित करना चाहते हैं कि दो चीजें सत्य हैं (बूलियन) बुलियन और (&) सबसे अच्छा विकल्प होगा।

आपके उदाहरण में, कोड e.Modifiers के भीतर Keys.Shift में अलग-अलग बिट्स के साथ व्यक्तिगत बिट्स की तुलना कर रहा है। न तो तर्क एक बूलियन मान का प्रतिनिधित्व करता है और इस प्रकार ऑपरेशन बूलियन (&) बूलियन (& &) के बजाय बिट-वार() है।

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