PHP और(ampersand, bitwise और) ऑपरेटर को समझना




operators bit-manipulation (4)

मैं अक्सर अपने कोड में ($var & 1) का उपयोग करता हूं, जो सही होता है यदि $var एक विषम संख्या है और झूठी है तो यह भी एक संख्या है।

लेकिन वास्तव में "और" क्या करता है?


और बाइनरी है and । यदि आपके पास बाइनरी मान है, और आप and एक और बाइनरी मान के साथ, तो परिणाम थोड़ा सा and दोनों का होगा। एक उदाहरण:

  01101010
& 01011001
= 01001000

सही बिट या तो 1 है (और उस स्थिति में संख्या एक विषम संख्या है) या यह 0 है, जिस स्थिति में संख्या भी है। यदि आप & 1 के साथ कोई संख्या है, तो आप केवल कम से कम महत्वपूर्ण बिट देखते हैं, और यदि चेक 1 या 0 है तो चेक करता है। जैसा कि अन्य ने उल्लेख किया है, बिट्स ऑपरेटरों को यह जानकारी के लिए देखें कि वे कैसे काम करते हैं।


बाइनरी सिस्टम के लिए मौलिक दो ऑपरेशन हैं OR और AND।

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

और इसका मतलब है 'अगर दोनों ए और बी चालू हैं'। असली दुनिया का उदाहरण श्रृंखला में दो स्विच है। वर्तमान केवल तभी पारित होगा जब दोनों वर्तमान के माध्यम से अनुमति दे रहे हों।

एक कंप्यूटर में, ये भौतिक स्विच नहीं होते हैं लेकिन अर्धचालक, और उनकी कार्यक्षमता को तर्क द्वार कहा जाता है । वे स्विच के रूप में चीजों के समान प्रकार करते हैं - वर्तमान या कोई वर्तमान पर प्रतिक्रिया।

पूर्णांक पर लागू होने पर, एक संख्या में प्रत्येक बिट को दूसरे नंबर पर प्रत्येक बिट के साथ जोड़ा जाता है। तो बिटवाई ऑपरेटरों को समझने के लिए OR और AND, आपको संख्याओं को बाइनरी में कनवर्ट करने की आवश्यकता है, फिर मिलान करने वाली बिट्स की प्रत्येक जोड़ी पर OR या AND ऑपरेशन करें।

इसीलिए:

00011011 (odd number)
AND
00000001 (& 1)
== 
00000001 (results in 1)

जहाँ तक

00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)

इसलिए (& 1) ऑपरेशन सही और सबसे कम 1 का उपयोग करके तर्क और तुलना करता है। अन्य सभी बिट्स को प्रभावी रूप से अनदेखा कर दिया जाता है क्योंकि कुछ भी और कुछ भी नहीं है। द्विआधारी में भी एक संख्या भी दशमलव नोटेशन में एक संख्या है (10 2 का एक बहु है)।

द्विआधारी प्रणालियों के अन्य मौलिक संचालन में शामिल नहीं है और एक्सओआर। इसका मतलब नहीं है 'अगर ए बंद है' और तर्क गेट का एकमात्र रूप है जो दो के बजाय केवल एक सिग्नल या 'पैरामीटर' लेता है। एक्सओआर का मतलब है 'अगर ए या बी चालू है, लेकिन दोनों नहीं'। और फिर एनएएनडी, एनओआर, और एनएक्सओआर हैं, जो मूल रूप से केवल एंड, या, और एक्सओआर के साथ संयुक्त नहीं हैं, यानी एनएएनडी का अर्थ है 'अगर ए और बी दोनों चालू नहीं हैं'।

प्रोग्रामिंग में, ऑपरेटर

& means AND,
| means OR, 
~ means NOT, and
^ means XOR.

दूसरों को इनका संयोजन करके बनाया जा सकता है, उदाहरण के लिए:

~ (a & b) is equivalent to a NAND operation

PHP विशिष्ट नोट

बिटवाई ऑपरेटर फ्लोटिंग-पॉइंट मानों पर काम नहीं करते हैं, और PHP फ्लोट वैल्यू में पहले पूर्णांक में पूर्ण रूप से परिवर्तित हो जाएगा। सीमाओं के बाहर संख्या जिन्हें पूर्णांक के रूप में व्यक्त किया जा सकता है शून्य पर छोटा कर दिया जाएगा - यानी, PHP_INT_MAX से अधिक संख्या अभिव्यक्ति ($num & 1) में "यहां तक ​​कि" दिखाई देगी)। यदि आप PHP_INT_MIN / PHP_INT_MAX के बाहर संख्याओं का समर्थन करना चाहते हैं, तो आपको fmod($num, 2) आवश्यकता होगी। यदि, हालांकि, आप 64-बिट PHP पर हैं, तो आपके पूर्णांकों को वैसे भी फ़्लोट की तुलना में अधिक सटीकता होगी।


मुझे पता है कि आपका प्रश्न बिटवाई ऑपरेटर को समझने के बारे में है और स्वीकृत उत्तर इसे अच्छी तरह से समझाता है। लेकिन उदाहरण के लिए, मैं मदद नहीं कर सकता लेकिन आपको मॉड्यूल ऑपरेटर का उपयोग करने की सिफारिश करता हूं:

($var % 2) /* instead of */ ($var & 1)

क्योंकि यह इरादा स्पष्ट करता है कि आप यह जांच रहे हैं कि संख्या विषम है (दो से विभाजित नहीं है), और यह अधिक सामान्य है, इसलिए आप उसी तरह ($ var% 3) का उपयोग कर सकते हैं और यह किसी भी एन के लिए कैसे काम करता है इसे कम कर सकते हैं।


अन्य उत्तरों के अलावा, यह ध्यान देने योग्य है

if(func1() && func2())

केवल func2() कॉल करेगा अगर func1() सत्य ("आलसी मूल्यांकन") देता है, जबकि

if(func1() & func2())

दोनों कार्यों को ध्यान में रखेगा, लेकिन दोनों के लिए सच्चाई सारणी समान होगी (माना जाता है कि वे बुलियन लौटते हैं)।

thomasrutter अंक (नीचे टिप्पणियों में) कि आप शायद बाद में अभ्यास में नहीं करना चाहिए। (A & B) में वही सत्यता नहीं होगी (A & B) (A && B) , खासकर जब A और B पूर्णांक हों। उदाहरण के लिए, यदि ए = 1 और बी = 2 (सच्चाई दोनों), ए और बी गलत होंगे, जबकि ए एंड बी बी सत्य है। इसके अलावा, एक और डेवलपर सोच सकता है कि यह दो एम्पर्सेंड्स के लिए एक टाइपो और 'सही' है।





bitwise-operators