समस्या विवरण
मान लीजिए हमारे पास एक संख्या n है। हमें जांचना है कि क्या यह संख्या 2 की घात है या नहीं। उदाहरण: यदि n = 16, तो आउटपुट true होगा; यदि n = 12, तो false।
तर्क
हम लॉजिकल ऑपरेशन्स का उपयोग करेंगे। जो संख्याएँ 2 की घात होती हैं, उनके बाइनरी प्रतिनिधित्व में सबसे महत्वपूर्ण बिट (MSB) 1 होती है और शेष सभी बिट्स 0 होती हैं। इसलिए यदि हम [n AND (n – 1)] करें, तो यह 0 लौटाएगा यदि n 2 की घात है।
उदाहरण: n = 16 = 10000 (बाइनरी), (n – 1) = 15 = 01111 (बाइनरी), तब 10000 AND 01111 = 00000 = 0।
उदाहरण (C)
#include <stdio.h>
#include <stdbool.h>
bool isPowerOfTwo(int n) {
return (n > 0 && !(n & (n - 1)));
}
int main() {
printf("%s\n", isPowerOfTwo(16) ? "true" : "false");
printf("%s\n", isPowerOfTwo(12) ? "true" : "false");
printf("%s\n", isPowerOfTwo(1) ? "true" : "false");
printf("%s\n", isPowerOfTwo(32) ? "true" : "false");
return 0;
}
इनपुट
16 12 1 32
आउटपुट
true false true true