"= =" का क्या अर्थ है? (पाइप बराबर ऑपरेटर)


249

मैंने Google खोज और स्टैक ओवरफ़्लो का उपयोग करके खोज करने की कोशिश की, लेकिन इसका कोई परिणाम नहीं दिखा। मैंने इसे ओपनसोर्स लाइब्रेरी कोड में देखा है:

Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;

"| =" ( pipe equal operator) का क्या अर्थ है?


4
मुझे आश्चर्य है कि अगर pipe equal operatorइस प्रश्न या विषय पर किसी अन्य प्रलेखन को जोड़ने से लोगों को खोजने में मदद नहीं मिलेगी।
डेनिस सेगुरेट

10
@EJP क्या आप लोग इस डॉक्स के बारे में बात कर रहे हैं । यह स्पष्ट रूप से बताता है कि डॉक्स को इस के उपयोग के बारे में प्रलेखन की कमी है ।
वत्संग ०२

36
जब तक आप यह नहीं जानते थे कि इसे पाइप के बराबर कहा जाता है, किसी से पूछे बिना खोज करना वास्तव में मुश्किल है।
ataulm

@ataulm ने वास्तव में, कुछ समय गुजारने के लिए एक शब्द के साथ आने के लिए बिताया vertical barजो आखिरकार मुझे यहां ले गया।
खंडहर

जवाबों:


323

|=वैसे ही पढ़ता है +=

notification.defaults |= Notification.DEFAULT_SOUND;

के समान है

notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;

|बिट-वार या ऑपरेटर कहां है।

सभी ऑपरेटरों को यहां संदर्भित किया जाता है

एक बिट-वार ऑपरेटर का उपयोग किया जाता है क्योंकि, जैसा कि अक्सर होता है, उन स्थिरांक झंडे को ले जाने के लिए एक इंटेंस को सक्षम करते हैं।

यदि आप देखने के लिए उन स्थिरांक में, आपको लगता है कि वे दो की शक्तियों में हैं देखेंगे:

public static final int DEFAULT_SOUND = 1;
public static final int DEFAULT_VIBRATE = 2; // is the same than 1<<1 or 10 in binary
public static final int DEFAULT_LIGHTS = 4; // is the same than 1<<2 or 100 in binary

तो आप बिट-वार या झंडे जोड़ने के लिए उपयोग कर सकते हैं

int myFlags = DEFAULT_SOUND | DEFAULT_VIBRATE; // same as 001 | 010, producing 011

इसलिए

myFlags |= DEFAULT_LIGHTS;

बस इसका मतलब है कि हम एक ध्वज जोड़ें।

और सममित रूप से, हम परीक्षण करते हैं कि एक ध्वज का उपयोग किया गया है &:

boolean hasVibrate = (DEFAULT_VIBRATE & myFlags) != 0;

2
जैसा j += 1;है वैसा ही है j = j + 1;
डेविड श्वार्ट्ज

1
@ARS: मैं जावा में एक काउंटर-उदाहरण के बारे में नहीं सोच सकता (शायद अगर jहै volatile?), लेकिन मैं इसके लिए आपका शब्द लूंगा।
डेविड श्वार्ट्ज

6
@DavidSchwartz देखें इस
arshajii

2
boolean hasVibrate = DEFAULT_VIBRATE & myFlags;- आप से अनुवाद कर सकते हैं intकरने के लिए booleanहै कि जावा में पसंद है? यह C में मान्य होगा, लेकिन मुझे लगा कि जावा में इसे लिखा जाना चाहिएboolean hasVibrate = ((DEFAULT_VIBRATE & myFlags) == DEFAULT_VIBRATE);
BlueRaja - Danny Pflughoeft

1
@DavidSchwartz वाह, कि तुलना के साथ +=अंत में मेरे लिए इसे समझने की चाल चली । धन्यवाद!
C4d

39

आपको अपने प्रश्न के लिए पहले से ही पर्याप्त उत्तर मिल गया है। लेकिन मेरे जवाब से आपको |=बाइनरी ऑपरेटर्स के बारे में अधिक जानकारी मिल सकती है ।

मैं बिटवाइज़ ऑपरेटरों के लिए तालिका लिख ​​रहा हूँ :
निम्नलिखित मान्य हैं:

----------------------------------------------------------------------------------------
Operator   Description                                   Example
----------------------------------------------------------------------------------------
|=        bitwise inclusive OR and assignment operator   C |= 2 is same as C = C | 2
^=        bitwise exclusive OR and assignment operator   C ^= 2 is same as C = C ^ 2
&=        Bitwise AND assignment operator                C &= 2 is same as C = C & 2
<<=       Left shift AND assignment operator             C <<= 2 is same as C = C << 2
>>=       Right shift AND assignment operator            C >>= 2 is same as C = C >> 2  
----------------------------------------------------------------------------------------

नोट सभी ऑपरेटर बाइनरी ऑपरेटर हैं।

यह भी नोट करें: (नीचे दिए गए बिंदुओं के लिए मैं अपना उत्तर जोड़ना चाहता था)

  • >>>जावा में बिटवाइस ऑपरेटर है जिसे अनसाइनड शिफ्ट कहा जाता है
    लेकिन >>>=जावा में ऑपरेटर नहीं। >>> = ऑपरेटर

  • ~बिटवाइज़ 0 to 1 and 1 to 0सप्लीमेंट बिट्स है, (यूनरी ऑपरेटर) लेकिन ~=ऑपरेटर नहीं।

  • इसके अतिरिक्त, !लॉजिकल नॉट ऑपरेटर नहीं कहा जाता है, लेकिन यह !=जांचता है कि क्या दो ऑपरेंड का मूल्य बराबर है या नहीं, यदि मान बराबर नहीं हैं तो स्थिति सच हो जाती है। उदा (A != B) is true। जहां के रूप में A=!Bइसका मतलब है अगर Bहै trueतो Aहो जाते हैं false(और अगर Bहै falseतो Aहो जाते हैं true)।

साइड नोट: |पाइप नहीं कहा जाता है, इसके बजाय OR कहा जाता है, पाइप शेल शब्दावली है एक प्रक्रिया को अगले करने के लिए स्थानांतरण।


9
मैं इस धारणा के तहत था कि "पाइप" चरित्र का नाम था, जो शेल शब्द से आया है। लेकिन, विकिपीडिया को देखते हुए, इसे वास्तव में "वर्टिकल बार" कहा जाता है और "पाइप" शेल कमांड्स के लिए विशिष्ट है। बस उस साइड नोट को जोड़ने के लिए धन्यवाद कहना चाहता था!
कालेब ब्रिंकमैन

18

मैं |=ग्रूवी में क्या करता है पर एक उत्तर की तलाश कर रहा था और हालांकि ऊपर दिए गए उत्तर सही हैं, उन्होंने मुझे एक विशेष कोड कोड को समझने में मदद नहीं की, जिसे मैं देख रहा था।

विशेष रूप से, जब एक बूलियन वैरिएबल पर लागू किया जाता है "= =" यह पहली बार TRUE पर सेट करेगा, तो यह दाईं ओर एक सत्य अभिव्यक्ति का सामना करेगा और सभी के लिए इसके TRUE मान को रखेगा। = बाद के कॉल एक कुंडी की तरह।

यहाँ इसका एक सरलीकृत उदाहरण दिया गया है:

groovy> boolean result  
groovy> //------------ 
groovy> println result           //<-- False by default
groovy> println result |= false 
groovy> println result |= true   //<-- set to True and latched on to it
groovy> println result |= false 

आउटपुट:

false
false
true
true

संपादित करें : यह क्यों उपयोगी है?

ऐसी स्थिति पर विचार करें जहां आप जानना चाहते हैं कि क्या कुछ भी विभिन्न वस्तुओं पर बदल गया है और यदि ऐसा है तो कुछ परिवर्तनों को सूचित करें। तो, आप एक hasChangesबूलियन को सेटअप करेंगे |= diff (a,b)और फिर उसे सेट करेंगे |= dif(b,c)आदि। यहाँ एक संक्षिप्त उदाहरण दिया गया है:

groovy> boolean hasChanges, a, b, c, d 
groovy> diff = {x,y -> x!=y}  
groovy> hasChanges |= diff(a,b) 
groovy> hasChanges |= diff(b,c) 
groovy> hasChanges |= diff(true,false) 
groovy> hasChanges |= diff(c,d) 
groovy> hasChanges 

Result: true

10
हां, जावा में समान है। लेकिन इसके लायक ध्यान देने योग्य बात है कि इस तरह या आपरेशन y|=exprहै शॉर्ट सर्किट नहीं (विपरीत y = y || expr), जिसका अर्थ है कि exprहमेशा का मूल्यांकन किया। यह पहली बार के लिए मेरे लिए स्पष्ट नहीं था :) तो यह है कि प्रतिस्थापन पुनर्रचना से पहले टिप्पणी के लिए महत्वपूर्ण है y|=expry=y||xहै शब्दार्थ बराबर नहीं में मामला exprवास्तव में साइड इफेक्ट है।
एनआईए

1
और, इसे ध्यान में हो रही है, आपके मामले में साथ hasChangesयह होगा शायद बेहतर हो पसंद करते हैं y=y||x, कम परिपथ से लाभ के लिए फार्म जब आप किसी भी परिवर्तन पाया यह वास्तव में susequent डिफ है क्योंकि आप पहले से ही जवाब पता की जरूरत नहीं है क्योंकि। (विशेष रूप से वास्तविक जीवन की स्थिति में महत्वपूर्ण है जब तुलना की गई वस्तुएं जटिल होती हैं और diffउन्हें आईएनजी काफी तेज नहीं होती है)
NIA

@NIA वोट के लिए धन्यवाद। हाँ, मैं छोटी बात के बारे में आपकी बात से सहमत हूँ।
dbrin

2
@FranklinYu बेशक कार्यान्वयन विस्तार नहीं। गैर-शॉर्ट-सर्कुलेट विशेष रूप से उस जगह पर उल्लेख नहीं किया जाता है जिसे आपने केवल संदर्भित किया है क्योंकि यह ख़ासियत नहीं है - यह अधिकांश ऑपरेटरों के लिए डिफ़ॉल्ट और सामान्य व्यवहार है। ख़ासियत वास्तव में ||और &&, और इसी खंड 15.23 और 15.24 के इसी खंड में लघु-परिवाहीपन है , इस तथ्य को स्पष्ट रूप से घोषित किया गया है, और इस अंतर से |और &जोर दिया गया है।
एनआईए

2
@FranklinYu तो मुझे लगता है कि आपके द्वारा संदर्भित अनुभाग में नीचे इस बारे में फिर से कुछ कहने की आवश्यकता नहीं थी (15.26.2 "कंपाउंड असाइनमेंट ऑपरेटर्स") सिर्फ इसलिए कि कंपाउंड असाइनमेंट बस हमेशा नॉन-शॉर्ट-सर्किट होते हैं (ऐसा कोई ||=और &&=ऑपरेटर नहीं है जो होगा नियम तोड़ो और विशेष उल्लेख की आवश्यकता है)।
एनआईए

13

यह इसके लिए एक कमी है:

notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;

और |थोड़ा बुद्धिमान है या।



3

नोट: || = मौजूद नहीं है (तार्किक या) आप उपयोग कर सकते हैं

y= y || expr; // expr is NOT evaluated if y==true

या

y = expr ? true : y;  // expr is always evaluated.

4
पूर्ण नहीं: आप अभी भी y |= exprबूलियन के साथ उपयोग कर सकते हैं और यह उसी पर परिणाम देता हैy आपके वेरिएंट महत्वपूर्ण नोट के साथ कि यह शॉर्ट-कर्टिट नहीं है , जिसका अर्थ है कि एक्सप का हमेशा मूल्यांकन किया जाता है, यहां तक ​​किy==true
एनआईए
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.