java हरण जांचें कि क्या एक पूर्णांक के भीतर केवल एक सिंगल बिट निर्धारित किया गया है(इसकी स्थिति जो भी हो)




पूर्णांक संख्या क्या होती है (5)

मैं एक 64-बिट पूर्णांक के भीतर बिट्स का उपयोग कर झंडे को संग्रहीत करता हूं
मैं जानना चाहता हूं कि 64 बिट्स पूर्णांक के भीतर जो भी स्थिति है, एक बिट सेट है (ei मुझे किसी विशेष बिट की स्थिति के बारे में परवाह नहीं है)।

boolean isOneSingleBitSet (long integer64)
{
   return ....;
}

मैं बिट ट्विडिंग हैक्स (सीन एरॉन एंडरसन द्वारा) का उपयोग करके बिट्स की संख्या को गिना सकता हूं, लेकिन मैं सोच रहा हूं कि सिर्फ एक बिट सेट होने पर पता लगाने का सबसे कारगर तरीका क्या है ...

मुझे कुछ अन्य संबंधित प्रश्न मिले:

और कुछ विकिपीडिया पृष्ठ भी हैं:

NB: मेरा आवेदन जावा में है, लेकिन मैं अन्य भाषाओं का उपयोग करके अनुकूलन के बारे में उत्सुक हूं ...

संपादित करें : लापू वान्ह फक ने बताया कि मेरे प्रश्न के भीतर मेरी पहली कड़ी में पहले ही उत्तर मिला है: अनुभाग देखें, निर्धारण करें कि क्या बिट पूर्णता वाले हैक्स (सीन एरॉन एंडरसन द्वारा) में एक पूर्णांक 2 की शक्ति है । मुझे एहसास नहीं हुआ कि एक सिंगल बिट दो की शक्ति के समान था।


मान लीजिए कि X एक 64 बिट इंटरफ़ेस है जिसे 0s से भरा है जिसे आप ढूंढ रहे हैं;

  return ((64bitinteger&X)==X)

यदि आप वाकई देखना चाहते हैं कि एक सिंगल बिट सेट है, तो आप अनिवार्यतः जांच कर रहे हैं कि संख्या 2 की शक्ति है। ऐसा करने के लिए आप ऐसा कर सकते हैं:

if ((number & (number-1)) == 0) ...

यह 2 की शक्ति के रूप में 0 को भी गिना जाएगा, इसलिए आपको जरूर नंबर की जांच करनी चाहिए अगर यह महत्वपूर्ण है। तो फिर:

if (number != 0 && (number & (number-1)) == 0) ...

मान लें कि आपके पास पहले से ही एक कुशल - या हार्डवेयर - ffs() कार्यान्वयन - पहले सेट को ढूंढें - आप निम्नानुसार कार्य कर सकते हैं:

bool isOneSingleBitSet (long integer64)
{
   return (integer64 >> ffs(integer64)) == 0;
}

ffs() फ़ंक्शन पहले ही उपलब्ध हो सकता है, या आप ऊपर दिए गए अपना खुद का लिंक देख सकते हैं


(एक्स का उपयोग तर्क के रूप में)

पता लगाना है कि कम से कम एक बिट सेट होने पर आसान है:

return x!=0;

इसी तरह पता लगाया जाए कि बिट एक (दूसरा सबसे कम बिट) सेट किया गया है तो यह आसान है:

return (x&2)!=0;

बिल्कुल एक बिट iff सेट है, यह दो की शक्ति है। यह काम:

return x!=0 && (x & (x-1))==0;

ऐसा लगता है कि आप एक बिटवर्ड कर सकते हैं और एक बिट के long प्रतिनिधित्व के साथ जो आप देखना चाहते हैं उदाहरण के लिए, एलएसबी की जांच

return(   (integer64 & 1L)!=0  );

या सही से चौथा बिट की जांच करने के लिए

return(   (integer64 & 8L)!=0  );




bitwise-operators