जावा में एक बूलियन पर एक बिटवाइज़ ऑपरेटर का प्रभाव


118

बिटवाइज़ ऑपरेटरों को वैरिएबल की यात्रा करने और बिट द्वारा उन पर काम करने वाले हैं। पूर्णांक, दीर्घ, वर्ण के मामले में यह समझ में आता है। इन चर में उनके आकार द्वारा लागू मूल्यों की पूरी श्रृंखला हो सकती है।

बूलियन के मामले में, हालांकि, बूलियन में केवल दो मूल्य हो सकते हैं। १ = सत्य या ० = असत्य। लेकिन बूलियन का आकार परिभाषित नहीं है। यह बाइट जितना बड़ा हो सकता है या छोटा सा हो सकता है।

तो एक बूलियन पर बिटवाइज़ ऑपरेटर का उपयोग करने का क्या प्रभाव है? क्या जेवीएम अनिवार्य रूप से एक सामान्य तार्किक ऑपरेटर के लिए अनुवाद करता है और आगे बढ़ता है? क्या यह ऑपरेशन के उद्देश्य से बूलियन को एकल बिट इकाई के रूप में मानता है? या एक बूलियन के आकार के साथ परिणाम अपरिभाषित है?


1
मुझे लगता है कि आप बूलियन पर बिटवाइज़ ऑपरेटर का उपयोग नहीं कर सकते। केवल संख्याओं पर। मुझे यकीन है कि ~ काम नहीं करेगा, मुझे नहीं पता कि अन्य ऑपरेटरों के बारे में क्या है।
मार्टिअन कोर्टको 18

4
आप उनमें से कुछ का उपयोग कर सकते हैं, हमने अभी खोजा है a | हमारे विरासत कोड में इस्तेमाल किया। हम इसे हटा रहे हैं, लेकिन यह कोड संकलित और काम कर रहा है।
डैनियल बिंगहैम

9
चूँकि एक छोटा-सा परिचालित है और दूसरा (परिवर्तन का उत्तर नहीं देखें), इससे पहले कि आप बदलें | || आप यह सुनिश्चित करना चाहते हैं कि बाद के बूलियन अभिव्यक्तियों का कोई साइड-इफ़ेक्ट न हो जो मूल प्रोग्रामर को हमेशा निष्पादित करना हो।
जॉन एम गैंट

जवाबों:


122

जब ऑपरेटर आदिम अभिन्न प्रकार होते हैं , तो ऑपरेटर &, ^और |बिटवाइज़ ऑपरेटर होते हैं। जब ऑपरेटर बूलियन होते हैं, तो वे तार्किक ऑपरेटर होते हैं, और बाद के मामले में उनका व्यवहार निर्दिष्ट होता है। विवरण के लिए जावा भाषा विनिर्देश की धारा 15.22.2 देखें।


57
विशेष रूप से, और ^ और | और | गैर-शॉर्ट-सर्किट तार्किक बूलियन ऑपरेटर हैं।
केन

14
यहाँ ऊपर उल्लिखित अनुभाग का सीधा लिंक है: docs.oracle.com/javase/specs/jls/se7/html/…
एंडी थॉमस

यदि उपरोक्त सत्य है, तो ideone.com/oGSF7c एक अशक्त पॉइंटर अपवाद को क्यों फेंक रहा है? यदि |=ऑपरेटर तार्किक था, तो प्रोग्राम को कभी x.getValue()निर्देश नहीं चलाना चाहिए था।
ikromm

1
@JohnKrommidas, आपका x अशक्त है, जिसके कारण आपको NullPointerException मिल रही है। आपको इसे तुरंत करने की आवश्यकता है।
बेन

4
@Ben, जैसा कि @Ken कहता है, तर्क गैर-लघु-परिचालित है, इसलिए दूसरे भाग का मूल्यांकन किया जाता है। तो a || x.foo()सुरक्षित है अगर x शून्य है, लेकिन a | x.foo()नहीं है। |=निम्न नियमों का पालन करता है |
माइकल स्मिथ

86

बिटवाइज ऑपरेटर के प्रयोग से शॉर्ट-सर्किटिंग व्यवहार को कम किया जा सकता है:

boolean b = booleanExpression1() && booleanExpression2();
boolean b = booleanExpression1() & booleanExpression2();

यदि booleanExpression1()मूल्यांकन किया जाता है false, तो
booleanExpression2()पहले मामले में मूल्यांकन नहीं किया जाता है, और
booleanExpression2()(जो भी दुष्प्रभाव हो सकते हैं) का मूल्यांकन दूसरे मामले में किया जाता है,


2
और बिटवाइज ऑपरेशन शॉर्ट-सर्किट एक ( आमतौर पर मूल्यांकन सरल है) की तुलना में तेजी से प्रदर्शन करता है
आरडीएस

1
बिटवाइज़ &तेज़ हो जाएगा, लेकिन दूसरे फ़ंक्शन के लिए कॉल को नजरअंदाज किया जा सकता है&&
NatNgs

20

क्या अन्य उत्तर में शामिल है के अलावा, यह की कीमत है कि ध्यान देने योग्य है &&और ||से अलग पूर्वता है &और |

पूर्ववर्ती तालिका से निकालें (शीर्ष पर सर्वोच्च वरीयता के साथ)।

bitwise AND                 &
bitwise exclusive OR        ^
bitwise inclusive OR        |
logical AND                 &&
logical OR                  ||

आपके लिए इसका क्या मतलब है?

बिल्कुल कुछ भी नहीं है, जब तक आप रहना या तो केवल &और |या केवल &&और ||

लेकिन, चूँकि |इनकी तुलना में अधिक पूर्वता होती है &&(जैसा कि विपरीत है ||, जिसकी पूर्ववर्ती स्थिति कम है), स्वतंत्र रूप से मिलाने से उनमें अप्रत्याशित व्यवहार हो सकता है।

तो a && b | c && dके रूप में ही है a && (b | c) && d,
के रूप में करने का विरोध किया a && b || c && dजो होगा (a && b) || (c && d)

यह साबित करने के लिए कि वे समान नहीं हैं, सत्य तालिका से एक अर्क पर विचार करें:

a | b | c | d | (b|c) | (a&&b) | (c&&d) | a && (b|c) && d | (a&&b) || (c&&d)
F | T | T | T |   T   |   F    |    T   |         F       |        T
                                                  ^                ^
                                                  |- not the same -|

यदि आप चाहते हैं कि या से अधिक होने की पूर्व या, आप उपयोग कर सकते हैं |और &&एक साथ, लेकिन यह अनुशंसित नहीं है।

लेकिन आपको वास्तव में विभिन्न प्रतीकों (a && b) || c( अर्थात कोष्ठक को स्पष्ट करने के लिए कोष्ठक), a && b && c(जब कोई कोष्ठक की आवश्यकता हो) का उपयोग करके पूर्वता स्पष्ट करने के लिए उन्हें कोष्ठक में रखा जाना चाहिए ।


3

यहां तक ​​कि अगर यह काम करेगा आप इसे नहीं करना चाहिए। भाषा चश्मा बिटवाइज़ ऑपरेटरों को केवल तब परिभाषित करता है जब दोनों ऑपरेंड आदिम पूर्णांक प्रकार के होते हैं या दोनों बूलियन प्रकार के होते हैं। मैं किसी अन्य मामले के लिए कहूंगा कि परिणाम परिभाषित नहीं हैं:

http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228


सवाल है बूलियन्स के बारे में, पुरातन या पुरातन और बूलियन का एक मिश्रण के बारे में नहीं।
टैलोनक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.