बिटवाइज़ ऑपरेटरों की तुलना की तुलना में कम प्राथमिकता क्यों है?


63

क्या कोई औचित्य की व्याख्या कर सकता है, क्यों सबसे लोकप्रिय भाषाओं के एक समूह में (नीचे नोट देखें) तुलना ऑपरेटरों (==; <;>, <,>, <=>>) को बिटवाइस ऑपरेटरों की तुलना में उच्च प्राथमिकता है ((; |, |, ^) , ~)

मुझे नहीं लगता कि मैंने कभी ऐसे उपयोग का सामना किया है जहां यह पूर्वता स्वाभाविक होगी। यह हमेशा की तरह सामान है:

  if( (x & MASK) == CORRECT ) ...   // Chosen bits are in correct setting, rest unimportant

  if( (x ^ x_prev) == SET )      // only, and exactly SET bit changed

  if( (x & REQUIRED) < REQUIRED )   // Not all conditions satisfied

मेरे द्वारा उपयोग किए जाने वाले मामले:

  flags = ( x == 6 | 2 );     // set bit 0 when x is 6, bit 1 always.

पास न के बराबर हैं।

ऑपरेटरों की ऐसी पूर्वता पर निर्णय लेने के लिए भाषा डिजाइनरों की प्रेरणा क्या थी?


उदाहरण के लिए, शीर्ष 12 भाषाओं में सभी लेकिन SQL इस तरह है कि प्रोग्रामिंग लैंग्वेज की लोकप्रियता सूची में langpop.com पर: C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL, Ruby, Shell, Visual Basic।


16
वापस मूल डिजाइन में गलती सी
शाफ़्ट सनकी

7
@gnat, उस शिकायत का क्या मतलब है? ओपी ने "सभी" नहीं कहा, बस "सबसे लोकप्रिय भाषाओं का एक गुच्छा"। और विशाल बहुमत इस आदेश का पालन करते हैं। इस तालिका में, शीर्ष 12 में से केवल एक (SQL) नहीं: langpop.com

3
@ dan1111 बिंदु, स्वाभाविक रूप से, उत्तरदाताओं को पूछे गए प्रश्न को बेहतर ढंग से समझने और बेहतर उत्तर प्रदान करने में मदद करने के लिए है। आप देखें, यह द गेसिंग गेम के लिए कोई जगह नहीं है - या, जैसा कि टूर पेज कहता है, "यह एक चर्चा मंच नहीं है। कोई चिट-चैट नहीं है।"
gnat

7
@gnat, मैं अनुमान लगाने के खेल के बारे में आपकी चिंता से सहमत हूं, लेकिन मुझे नहीं लगता कि यह योग्यता तब होती है जब लगभग हर लोकप्रिय भाषा वर्णित व्यवहार प्रदर्शित करती है।

5
@ डंक: आम "कूबड़ द्वारा" दृष्टिकोण है [arithmetics] [logic operator] [arithmetics]। अधिकांश प्रोग्रामर कोष्ठक की गड़बड़ी पैदा नहीं करते हैं if(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))- जैसे कि लॉजिक्स पर अंकगणित की पूर्ववर्ती स्थिति को मान लेंगे और ऊपर की if( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() )) पूर्ववर्तीता को मानते हुए लिखेंगे । अब सहज रूप से एक ही व्यवहार करना चाहिए, XOR अंकगणितीय ऑपरेटर। तथ्य यह है कि पूरी तरह से सहज ज्ञान युक्त है के रूप में व्याख्या की है। +<if( x ^ getMask() != PATTERN )if( x ^ ( getMask() != PATTERN ) )
एसएफ।

जवाबों:


72

भाषाओं ने सी से कॉपी किया है, और सी के लिए, डेनिस रिची बताते हैं कि शुरू में, बी में (और शायद शुरुआती सी), केवल एक ही रूप था &जो कि संदर्भ के आधार पर एक बिटवाइज़ और एक तार्किक था। बाद में, प्रत्येक फ़ंक्शन को अपना ऑपरेटर मिल गया: &बिटवाइज़ एक &&के लिए और तार्किक एक के लिए। फिर वह जारी है

उनका मार्मिक परिचय सी की पूर्ववर्ती नियमों की एक अनंतता की व्याख्या करता है। बी में एक लिखते हैं

if (a == b & c) ...

यह देखने के लिए कि क्या aबराबरी bऔर cगैर-शून्य है; ऐसी सशर्त अभिव्यक्ति में यह बेहतर है कि &पहले की तुलना में कम है ==। बी से सी में परिवर्तित करने के लिए, एक को बदलने के लिए चाहता है &के द्वारा &&इस तरह के एक बयान में; रूपांतरण को कम दर्दनाक बनाने के लिए, हमने &ऑपरेटर की पूर्ववर्ती स्थिति को उसी के सापेक्ष बनाए रखने का निर्णय लिया ==, और पहले से &&थोड़ी सी पूर्वता को विभाजित किया &। आज, ऐसा लगता है कि यह के रिश्तेदार precedences स्थानांतरित करने के लिए बेहतर हो गया होता &और ==, और इस तरह एक आम सी मुहावरा को आसान बनाने: एक और मूल्य के खिलाफ एक नकाबपोश मूल्य का परीक्षण करने के लिए, एक लिखना चाहिए

if ((a & mask) == b) ...

जहां आंतरिक कोष्ठक की आवश्यकता होती है, लेकिन आसानी से भूल जाते हैं।


1
कि अगर असफल नहीं हो सकते हैं c=2या फिर था a==bमें परिणाम ~0और नहीं 1?
एसएफ।

ऐसा लगता है, एक == बी रिटर्न 0 या 1, cm.bell-labs.com/cm/cs/who/dmr/kbman.html देखें ।
अप्रैलग्राम

उत्तर में संदर्भ देखें और पूर्ववर्ती पाठ पढ़ें।
SShaheen

1
@MasonWheeler: विशेष रूप से एम्बेडेड सिस्टम में, कभी-कभी फ़ंक्शन-जैसे मैक्रोज़ का उपयोग करना आवश्यक होता है [कुछ मामलों में, वे इन-लाइन परिमाण की तुलना में इन-लाइन कार्यों की तुलना में बेहतर प्रदर्शन की पेशकश कर सकते हैं, और कुछ एम्बेडेड सिस्टम में जो महत्वपूर्ण हो सकते हैं]। ऐसे मैक्रो के भीतर परिवर्तनीय घोषणा संभव नहीं है; एक मैक्रो के भीतर एक वैश्विक चर का उपयोग कर काम हो सकता है, लेकिन वास्तव में icky लगता है।
सुपरकैट

6
@MasonWheeler: क्या आप मात्रा 1000 में $ 0.50 के लिए रास्पबेरी पाई या Arduino पा सकते हैं?
सुपरकैट

7

बिटवाइज़ ऑपरेटर, वैचारिक और रूप से, दोनों में तार्किक ऑपरेटरों से संबंधित हैं, जो संभवतः बताते हैं कि वे पूर्ववर्ती तालिका में एक दूसरे के पास क्यों हैं। शायद कोई यह भी तर्क दे सकता है कि यह &अधिक से अधिक होने के लिए भ्रामक होगा ==, फिर &&भी कम होगा ==

एक बार एक मिसाल मिसाल (!) सेट हो जाने के बाद, शायद अन्य भाषाओं के लिए यह बेहतर था कि वह निरंतरता के लिए इसका पालन करें।

हालाँकि, मैं आपसे सहमत हूँ कि यह इष्टतम नहीं है। वास्तविक उपयोग में, बिट संचालक तार्किक लोगों की तुलना में गणितीय संचालकों की तरह अधिक होते हैं, और यह बेहतर होगा कि वे गणितीय संचालकों के साथ पहले से ही समूहबद्ध हों।

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