मान लीजिए कि हमारे पास int x = 371
है, जो बाइनरी प्रारूप 101110011
में है। मैं बाएं सबसे अनसेट बिट (इस मामले में 7) की अनुक्रमणिका, और सही-अनसेट बिट की अनुक्रमणिका (इस मामले में 2) को ढूंढना चाहता हूं। ऐसा करने का सबसे प्रभावी तरीका क्या है? अगर मैं गलत नहीं हूँ, मेरे वर्तमान कार्यान्वयन रैखिक समय लगता हैजावा में बाएं/दाएं-सबसे अनसेट बिट की अनुक्रमणिका ढूँढने का सबसे प्रभावी तरीका क्या है?
public class BitOperatons {
public static int setBit(int x, int i) {
int y = x | (1 << i);
return y;
}
public static boolean isBitSet(int x, int i) {
int y = setBit(0, i);
return y == (x & y);
}
public static int findLeftMostSetBit(int x) {
for (int i = 31; i >= 0; i--) {
if (isBitSet(x, i))
return i;
}
return -1;
}
public static int findRightMostUnsetBit(int x) {
for (int i = 0; i <= 31; i++) {
if (! isBitSet(x, i))
return i;
}
return -1;
}
public static int findLeftMostUnsetBit(int x) {
int k = findLeftMostSetBit(x);
for (int i = k; i >= 0; i--) {
if (! isBitSet(x, i))
return i;
}
return -1;
}
public static1+ void main(String[] args) {
int x =
(1 << 0) |
(1 << 1) |
(1 << 4) |
(1 << 5) |
(1 << 6) |
(1 << 8);
System.out.println(findLeftMostUnsetBit(x));
System.out.println(findRightMostUnsetBit(x));
}
}
:
यहाँ मैं क्या है है। क्या हम बेहतर कर सकते हैं?
रैखिक से बेहतर करना संभव नहीं है। – toto2
@ टोटो, यह सच नहीं है, दोहर भूल गया है, हैकर की डिलाइट 5-3 (उदाहरण के लिए) (अग्रणी शून्य, जो इंटेगर.क्लास का हिस्सा है) – bestsss
@bestsss, ठीक है अगर आप फ्लोलो द्वारा सुझाए गए मशीन निर्देशों का मतलब है तो ठीक है। यदि आप एक उप-रैखिक अलगो के बारे में जानते हैं, तो मैं जानना चाहता हूं। – toto2