क्या एक एकल पाइप का उपयोग करता है '|' एक कार्य तर्क में क्या?


82

उदाहरण के लिए निम्न कोड लें:

phpinfo(INFO_MODULES | INFO_ENVIRONMENT | INFO_VARIABLES);

एक एकल तर्क का उपयोग किया जा रहा है, लेकिन मैं एक एकल पाइप प्रतीक द्वारा अलग किए गए विकल्पों की एक सूची प्रदान कर रहा हूं।

  • फ़ंक्शन में तर्क मूल्य के साथ वास्तव में क्या हो रहा है?
  • क्या मैं अपने स्वयं के कार्यों में उसी चीज़ का उपयोग कर सकता हूं?
  • क्या ऐसा है, और इसके बजाय एक सरणी पास करने के लिए इस पर लाभ हैं?

कि OR का बिटवाइज़ संस्करण है, नियमित संस्करण में दो पाइप होंगे।
1

32
आप जानते हैं, मैं यह नहीं कह सकता कि कुछ टिप्पणीकार सवाल पूछने की इच्छा रखने वाले उपयोगकर्ताओं को कैसे परेशान करते हैं ... इस बात के लिए कि यह उत्तर देने के लिए 210K प्रतिनिधि के साथ उपयोगकर्ता लेता है!
निकर

5
मुझे आश्चर्य है कि अगर प्रतिष्ठा वाले एक उपयोगकर्ता> एसओ पर 5000 जिन्होंने कोई प्रश्न नहीं पूछा है, तो वास्तव में कोई सवाल नहीं है या सवाल पूछने वाले को कमजोरी का संकेत मानते हैं?
पीटर

15
आइए यह भी महसूस करें कि प्रतीकों को खोजना मुश्किल है।
लेवी मॉरिसन

9
@nickhar .. और उस दस्तावेज़ पृष्ठ पर उतरने के लिए, आपको पहले स्थान पर विशिष्ट शब्द से परिचित होना होगा, जो किसी तरह सवाल का पूरा बिंदु है ..
ओबेरम क्रोनन

जवाबों:


136

बिटवाइज ऑपरेटर

बिटवाइज़ ऑपरेटर शामिल मूल्यों के बिट्स को संशोधित करते हैं। ORमूल रूप से बिट और दाएं तर्क दोनों के प्रत्येक बिट के साथ एक बिटवाइज़ । उदाहरण के लिए:

5 | 2

बिट्स / बाइनरी में अनुवाद करेगा:

101 | 10

जिसके परिणामस्वरूप होगा:

111

चूंकि:

1 || 0 = 1
0 || 1 = 1
1 || 0 = 1

और एक पूर्णांक के रूप में जो कि 7 का प्रतिनिधित्व है जो वास्तव में आपको मिलता है अगर आप:

echo 5 | 2;

एडी इज़र्ड के शब्दों में ... झंडा!

जैसा कि इग्नासियो बताता है, यह अक्सर कई झंडे को संयोजित करने के तरीके के रूप में PHP (और अन्य भाषा) में उपयोग किया जाता है। प्रत्येक ध्वज को आमतौर पर एक स्थिरांक के रूप में परिभाषित किया जाता है, जिसका मूल्य सामान्य रूप से एक पूर्णांक पर सेट होता है जो एक अलग ऑफसेट पर सिर्फ एक बिट का प्रतिनिधित्व करता है:

define('FLAG_A', 1); /// 0001
define('FLAG_B', 2); /// 0010
define('FLAG_C', 4); /// 0100
define('FLAG_D', 8); /// 1000

तब जब आप ORइन दोनों को एक-दूसरे के साथ अपने बिट ऑफसेट पर संचालित करते हैं और कभी टकराते नहीं हैं:

FLAG_A | FLAG_C

इसके लिए अनुवाद:

1 | 100

तो आप अंत में चालू करते हैं:

101

जो पूर्णांक 5 का प्रतिनिधित्व करता है।

फिर सभी कोड को करना होगा- वह कोड जो सेट किए जा रहे अलग-अलग झंडों पर प्रतिक्रिया देगा- निम्नलिखित है (बिटवाइज़ का उपयोग करके AND):

$combined_flags = FLAG_A | FLAG_C;

if ( $combined_flags & FLAG_A ) {
  /// do something when FLAG_A is set
}

if ( $combined_flags & FLAG_B ) {
  /// this wont be reached with the current value of $combined_flags
}

if ( $combined_flags & FLAG_C ) {
  /// do something when FLAG_C is set
}

दिन के अंत में यह केवल चीजों को नामांकित करके पढ़ना आसान बनाता है, और आम तौर पर तार या सरणियों के बजाय पूर्णांक मानों पर निर्भर होकर अधिक इष्टतम होता है। स्थिरांक का उपयोग करने का एक अन्य लाभ यह है कि यदि उपयोग किए जाने पर उन्हें कभी गलत समझा जाता है, तो संकलक बताने और चेतावनी फेंकने के लिए बेहतर स्थिति में है ... यदि एक स्ट्रिंग मूल्य का उपयोग किया जाता है, तो यह जानने का कोई तरीका नहीं है कि कुछ भी गलत है।

define('MY_FLAG_WITH_EASY_TYPO', 1);

my_function_that_expects_a_flag( MY_FLAG_WITH_EASY_TPYO );

/// if you have strict errors on the above will trigger an error

my_function_that_expects_a_flag( 'my_string_with_easy_tpyo' );

/// the above is just a string, the compiler knows nowt with 
/// regard to it's correctness, so instead you'd have to
/// code your own checks.

5
महान पद के लिए +1। मुझे इस सब के बारे में अपने सिर को लपेटने में बहुत परेशानी हो रही थी, लेकिन आपके स्पष्टीकरण और उदाहरणों ने मुझे इसे समझने में बहुत मदद की है अगर मैंने अभी-अभी PHP प्रलेखन पढ़ा है। आपका बहुत बहुत धन्यवाद।
क्रिप्टोकरंसी

3
@ क्रिप्टोकरंसी की कोई चिंता नहीं - किसी चीज की खोज करने के बाद आप जिसका नाम नहीं ले सकते, वह काफी पेचीदा है - अब यदि केवल Google स्पष्टीकरणों और उदाहरणों को एक खोज शब्द के रूप में स्वीकार करता है :)
पेब्बल

4
महान व्याख्या और उदाहरण! +1
सेबलफॉस्ट

16

आप एक तर्क पास कर रहे हैं जो बिटवाइस या कई झंडों का है । आप ऑपरेटर को कहीं भी उपयोग कर सकते हैं।


10
धन्यवाद, @Ignacio, यह याद रखने के लिए कि SO पर हर कोई प्रोग्रामिंग का विशेषज्ञ नहीं है, या यह भी जानता है कि दस्तावेज़ीकरण कहां से शुरू करना है।
सेबलफॉस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.