इस समस्या में हमें एक संख्या N दी गई है जिसका बाइनरी प्रतिनिधित्व में केवल एक सेट बिट है। हमारा काम केवल सेट बिट की स्थिति का पता लगाना है। यदि संख्या में केवल एक सेट बिट है तो संख्या की स्थिति लौटा दें अन्यथा अमान्य संख्या मुद्रित करें।
समस्या को समझने के लिए एक उदाहरण लेते हैं,
इनपुट
N = 32
आउटपुट
6
स्पष्टीकरण
Binary representation of the number is 10000.
समाधान दृष्टिकोण
आगे बढ़ने से पहले जानने के लिए एक तथ्य यह है कि संख्या में केवल 1 सेट बिट होगा यदि यह 2 की शक्ति है। अन्यथा इसमें अधिक संख्या में सेट बिट्स होंगे।
एक सरल उपाय यह है कि सबसे दाहिने बिट से शुरू करें और फिर बिट्स के मूल्य की जांच करें। हम लूप का उपयोग यह जांचने के लिए करेंगे कि यह सेट है या नहीं।
हमारे समाधान की कार्यप्रणाली को दर्शाने वाला कार्यक्रम,
उदाहरण
#include <iostream> using namespace std; bool isPowerOfTwo(unsigned n) { if(n>0) { while(n%2 == 0) n/=2; if(n == 1) return true; } if(n == 0 || n != 1) return false; return false; } int findPostionOfSetBit(unsigned n) { unsigned i = 1, position = 1; while (!(i & n)) { i = i << 1; ++position; } return position; } int main(void){ int n = 64; if(!isPowerOfTwo(n)) cout<<"Invalid Number!"; else cout<<"The position of the number "<<n<<" is "<<findPostionOfSetBit(n); return 0; }
आउटपुट
The position of the number 64 is 7
समस्या को हल करने का एक वैकल्पिक तरीका यह है कि शिफ्ट ऑपरेशन का उपयोग करके संख्या को 0 होने तक दाईं ओर शिफ्ट किया जाए। अंत में 0 तक पहुंचने के लिए की गई शिफ्ट की संख्या सेट बिट की स्थिति है।
हमारे समाधान की कार्यप्रणाली को दर्शाने वाला कार्यक्रम,
उदाहरण
#include <iostream> using namespace std; bool isPowerOfTwo(unsigned n) { if(n>0) { while(n%2 == 0) n/=2; if(n == 1) return true; } if(n == 0 || n != 1) return false; return false; } int findPostionOfSetBit(unsigned n) { unsigned position = 0; while (n) { n = n >> 1; ++position; } return position; } int main(void){ int n = 64; if(!isPowerOfTwo(n)) cout<<"Invalid Number!"; else cout<<"The position of the number "<<n<<" is "<<findPostionOfSetBit(n); return 0; }
आउटपुट
The position of the number 64 is 7
समस्या को हल करने का एक और तरीका गणित के सूत्रों का उपयोग करना है। हम जानते हैं कि,
2i = n, where n is the number and i is the position of the number The values of i here can be found using the formula, i = log2(n)
हमारे समाधान की कार्यप्रणाली को दर्शाने वाला कार्यक्रम,
उदाहरण
#include <iostream> #include <math.h> using namespace std; bool isPowerOfTwo(unsigned n) { if(n>0) { while(n%2 == 0) n/=2; if(n == 1) return true; } if(n == 0 || n != 1) return false; return false; } int findPostionOfSetBit(unsigned n) { unsigned position = log2(n) + 1; ; return position; } int main(void){ int n = 64; if(!isPowerOfTwo(n)) cout<<"Invalid Number!"; else cout<<"The position of the number "<<n<<" is "<<findPostionOfSetBit(n); return 0; }
आउटपुट
The position of the number 64 is 7