2012-01-08 19 views
9

मैं सोच रहा था कि इसे कैसे किया:बिटवाइस या (|) समारोह तर्क में

func(param1|param2|param3) 

और फिर समारोह में उन मूल्यों को निकालने, मैं कई कार्यों में इस देखा है, या यह बेहतर यह करने के लिए है :

func(param1, ...) 

?

मैं इसे सी ++ में करने की कोशिश कर रहा हूं, और मैं इस कार्य को पैरामीटर के मानकों के रूप में मानने के बारे में सोच रहा था।

मैं इसे कैसे हल करूं?

उत्तर

15

पैराम 1, param2, param3 आमतौर पर विभिन्न बिट्स के साथ एक संख्या के रूप में परिभाषित किया जाता है। | बिटवाई विकल्प का एक ऑपरेटर है, जिसका अर्थ यह है कि यह अलग-अलग बिट्स पर काम करता है।

उदाहरण में:

const int param1 = 0x01; 
const int param2 = 0x02; 
const int param3 = 0x04; 

जब आप एक तर्क पारित कार्य करने के लिए आप पहले परिभाषित पैरामीटर के बिटवाइज़ विकल्प हैं। मान लें कि आप मूल्यों स्वतंत्र बिट्स के रूप में की तरह (दो की शक्तियों) है

void func(int arg){ 
    if(arg & param1) 
    // do something 
    if(arg & param2) 
    // do something else 
    // ... 
} 

func(param1 | param3); 
// "do something" will be done, 
// but "do something else" not. 
+0

तुम भी तरह 'पूर्णांक param1and2 = 0x03 संख्या निर्धारित कर सकते हैं;' जो 'param1 की तरह काम करते | param2'; –

+0

यह शायद ध्यान दिया जाना चाहिए कि '|' तर्क वापस बहाल करना केवल विशिष्ट तर्क पैटर्न के लिए संभव है, जैसे उत्तर में प्रस्तुत किए गए। अन्यथा यह संभव नहीं होगा: '3 | 4' '1 के समान है 6'। – Vlad

+0

धन्यवाद दोस्तों! यही वह है जो मैंने किया है क्योंकि पक्सडीब्लो ने – DarkRoast

11

:

समारोह में, आप एक अपघटन कर सकता हूँ नहीं है, लेकिन अगर एक निर्दिष्ट बिट पर सेट किया जाता है की जाँच करें, बिटवाइज़ संयोजन का उपयोग कर
#define IS_ON 0x01 
#define IS_LARGE 0x02 
#define IS_RED 0x04 

(या समतुल्य enums या const int मूल्यों, आप उन्हें कैसे करना चाहते हैं पर निर्भर करता है - मैं #define का उपयोग किया है यह क्या मैं करने के लिए इस्तेमाल कर रहा हूँ है बस क्योंकि), आप कर सकते हैं के रूप में पास उन्हें:

funcname (IS_ON | IS_RED); // passes in 0x05 

तो फिर तुम उनकी तरह कुछ के साथ निकालने :

void funcname (int bitmask) { 
    if ((bitmask & IS_ON) == IS_ON) { // 0x05 & 0x01 -> 0x01 
     // IS_ON bit is set. 
    } 
    : 
} 

एकल बिट विनिर्देशक के लिए, आप if (bitmask & IS_ON) फार्म के साथ प्राप्त कर सकते हैं, लेकिन आप पूर्ण जांच की जरूरत है अपने विनिर्देशक बहु-बिट हो सकता है अगर मान (उदाहरण के लिए 0 से 7 के तीन-बिट वॉल्यूम स्तर की तरह)।

+0

सुझाव दिया है is_not_on_and_is_not_red के लिए bitwise ऑपरेटर संयोजन क्या होगा? क्या यह 'funcname (~ IS_ON | ~ IS_RED) होगा; '? – ontherocks

+0

स्पष्ट स्पष्टीकरण, लेकिन आपको यह उल्लेख करना चाहिए कि बिट्स 2 की शक्ति होनी चाहिए। सही ? –

+0

स्थिरांक '0x01' के बजाय आप' 1 << 0', '1 << 2',' 1 << 3' आदि का उपयोग कर सकते हैं। मुझे उन और अधिक पठनीय मिलते हैं। –

0

यह कैसे बना सकता हूँ मनमाना बटन प्रकार के साथ "MessageBox" समारोह के लिए एक उपयोगी उदाहरण है:

enum Button 
{ 
    OK =  0x0001, 
    CANCEL = 0x0010, 
    YES =  0x0100, 
    NO =  0x1000 
}; 

void messagebox(char *text, int button) 
{ 
    char msg[256]; 
    strcpy(msg, text); 

    if ((button & Button::OK) == Button::OK) 
     strcat(msg, " [OK]"); 
    if ((button & Button::CANCEL) == Button::CANCEL) 
     strcat(msg, " [Cancel]"); 
    if ((button & Button::YES) == Button::YES) 
     strcat(msg, " [Yes]"); 
    if ((button & Button::NO) == Button::NO) 
     strcat(msg, " [No]"); 

    cout << msg << endl; 
} 

int main() 
{ 
    messagebox("salam", Button::OK | Button::CANCEL); 
    return 0; 
} 
संबंधित मुद्दे