बिटवाइज़ ऑपरेटर हमेशा अपने ऑपरेंड को पूर्णांक में परिवर्तित करते हैं। तो, 4 >> trueएक ही है 4 >> 1जो एक स्थिति से थोड़ा सा बदलाव करेगा
(decimal) 4 = (binary) 100
(binary) 100 >> 1 = (binary) 010
(binary) 010 = (decimal) 2
तो, का उपयोग करना trueया उपयोग falseकरने के लिए एक गोल चक्कर रास्ता है 1या 0।
notNotNotसमारोह बहुत ही सरल ऑपरेशन के कुल मिलाकर,:
a%2पहले नंबर को 0सम या 1विषम के लिए परिवर्तित करता है ।
>> bके 0लिए falseया 1स्थिति के लिए या तो पदों से सही बदलाव true।
aविषम है (1) और bहै false=1
- दाहिनी ओर शून्य शिफ्ट है, इसलिए संख्या समान रहती है।
aविषम है (1) और bहै true=0
- एकमात्र सेट बिट
1को सही और स्थानांतरित कर दिया गया है।
aसम है (०) और bहै false=0
- दाहिनी ओर शून्य शिफ्ट है, इसलिए संख्या समान रहती है।
aसम है (०) और bहै true=0
- आधार संख्या वह है
0जिसमें कोई बिट सेट नहीं है, इसलिए किसी भी राशि को सही तरीके से स्थानांतरित करने से इसमें बदलाव नहीं होता है।
!!() परिणाम को बूलियन में परिवर्तित करता है।
उस के साथ, यहाँ समाधान गलत है, क्योंकि notNotNot(2, true)उत्पादन होगा false- aसम है और bहै true। उम्मीद है कि यह उत्पादन करेगा है trueके बाद से !!true = true। वही समस्या किसी भी संख्या और के लिए मौजूद है true।
इसे राइट शिफ्ट के बजाय बिटवाइज़ एक्सओआर का उपयोग करके आसानी से तय किया जा सकता है:
aविषम है (1) और bहै false=1
- दोनों मैच, इसलिए वे फ़्लिप कर रहे हैं
0
aविषम है (1) और bहै true=0
- वे मेल नहीं खाते, इसलिए हम मिलते हैं
1
aसम है (०) और bहै false=0
- दोनों मेल खाते हैं, इसलिए हम मिलते हैं
0
aसम है (०) और bहै true=1
- वे मेल नहीं खाते, इसलिए हम मिलते हैं
1
notNotNot = (a,b) => !!(a%2 ^ b);
console.log("!!true = ", notNotNot(2, true))
console.log("!!!true =", notNotNot(3, true))
console.log("!!false = ", notNotNot(2, false))
console.log("!!!false = ", notNotNot(3, false))
//bonus
console.log("true = ", notNotNot(0, true))
console.log("false = ", notNotNot(0, false))
पूर्णता के लिए, यदि आप पूरी तरह से बिटवाइज़ ऑपरेशन चाहते हैं, तो:
मोडुलो ऑपरेशन %2को एक बिटवाइज़ में बदला जा सकता है और &1सबसे कम बिट प्राप्त किया जा सकता है । यहां तक कि संख्याओं के लिए, यह तब से निकलेगा 0जब आप कंप्यूटिंग करेंगे
xxx0
&
0001
जो शून्य है। और विषम संख्याओं के लिए भी यही लागू होता है लेकिन आपको परिणाम के रूप में एक मिलेगा:
xxx1
&
0001
तो के परिणाम a&1और a%2समान हैं। इसके अलावा, भले ही बिटवाइज़ ऑपरेशन्स संख्या को 32-बिट हस्ताक्षरित पूर्णांक में परिवर्तित कर दें जो कि समता को संरक्षित नहीं करेगा।
//larger than 31 bits
const largeValue = 2**31 + 1;
//larger than 32 bits
const veryLargeValue = 2**32 + 1
console.log("2**31 + 1 =", largeValue);
console.log("2**32 + 1 =", veryLargeValue);
console.log("2**31 + 1 to 32-bit signed integer =", largeValue | 0);
console.log("2**32 + 1 to 32-bit signed integer = ", veryLargeValue | 0);
const isOddModulo = number =>
console.log(`(${number} % 2) can detect an odd number: ${(number % 2) === 1}`);
const isOddBitwise = number =>
console.log(`(${number} & 1) can detect an odd number: ${(number & 1) === 1}`);
isOddModulo(largeValue);
isOddBitwise(largeValue);
isOddModulo(veryLargeValue);
isOddBitwise(veryLargeValue);
true=1(दशमलव) =01(बाइनरी) एक के द्वारा छोड़ी गई10बाइनरी या2दशमलव का उत्पादन करेगी ।