उदाहरण
import java.io.*;
public class Demo {
static int setBitsCount(int num) {
int count = 0;
while (num > 0) {
num &= (num - 1);
count++;
}
return count;
}
public static void main(String args[]) {
int num = 11;
System.out.println("11 में सेट बिट्स की संख्या है: ");
System.out.println(setBitsCount(num));
}
}
आउटपुट
11 में सेट बिट्स की संख्या है 3
व्याख्या: उपरोक्त ब्रायन कर्निघन एल्गोरिदम का कार्यान्वयन है। Demo क्लास में 'setBitsCount' नामक एक स्टेटिक फंक्शन होता है। यह फंक्शन जांचता है कि संख्या 0 है या नहीं, और यदि नहीं, तो 'count' नामक एक वेरिएबल को 0 असाइन करता है। यह संख्या और संख्या से 1 कम पर 'and' ऑपरेशन करता है।
अगला, इस ऑपरेशन के बाद 'count' मान इन्क्रीमेंट किया जाता है। अंत में, काउंट मान लौटाया जाता है। मुख्य फंक्शन में, वह मान जिसके सेट बिट्स ढूंढने हैं, परिभाषित किया जाता है। फंक्शन को संख्या को पैरामीटर के रूप में पास करके कॉल किया जाता है। प्रासंगिक संदेश कंसोल पर प्रदर्शित होते हैं।
ब्रायन कर्निघन एल्गोरिदम:
n & (n-1) दाएं से सबसे कम महत्वपूर्ण सेट बिट को अनसेट करता है।
11 = 1011 (बाइनरी)
11 & 10 = 1011 & 1010 = 1010 (10) - count=1
10 & 9 = 1010 & 1001 = 1000 (8) - count=2
8 & 7 = 1000 & 0111 = 0000 (0) - count=3
रुकें। कुल सेट बिट्स = 3
समय जटिलता: O(सेट बिट्स की संख्या) - सर्वोत्तम संभव
अन्य दृष्टिकोण:
| विधि | कोड | जटिलता | टिप्पणी |
|---|---|---|---|
| ब्रायन कर्निघन | n &= (n-1) | O(सेट बिट्स) | सेट बिट्स के लिए सबसे तेज |
| बिल्ट-इन | Integer.bitCount(n) | O(1) हार्डवेयर | JDK 1.5+, अत्यधिक अनुकूलित |
| शिफ्ट और काउंट | while(n>0){c+=n&1;n>>=1;} | O(लॉग n) | सभी बिट्स जांचता है |
| लुकअप टेबल | प्रीकंप्यूटेड बाइट काउंट्स | O(1) | बड़े डेटा के लिए तेज |
| पैरेलल स्ट्रीम | Long.bitCount के साथ | O(1) | Java 8+ |
उपयोग केस:
- हैमिंग वेट/दूरी गणना
- बिट मैनिपुलेशन समस्याएं
- सबसेट जनरेशन (बिटमास्क)
- कंप्रेशन एल्गोरिदम
- ग्राफिक्स (पॉपकाउंट)
लॉन्ग के लिए:
long count = Long.bitCount(longValue);