2010-07-01 12 views
29

में संख्या में केवल एक ही है, तो मैं यह जांचने के लिए एक अभिनव तरीका ढूंढ रहा हूं कि किसी नंबर पर हस्ताक्षर किए गए int में केवल एक ही है या नहीं।यह जांचने के लिए अभिनव तरीका है कि हस्ताक्षर int

मुझे अच्छी तरह से पता है कि मैं काउंटर, कुछ मॉड्यूलर डिवीजन और थोड़ा बदलाव के साथ बस एक लूप कर सकता हूं। लेकिन अगर कोई बेहतर तरीका है तो मैं उत्सुक हूं क्योंकि हम केवल एक बिट की तलाश में हैं।

bool HasOnlyOneBit (int numb) 
{ 
    //return true if numb has only one bit (I.E. is equal to 1, 2, 4, 8, 16... Int.MinValue) 
} 
+10

अभिनव? आपका मतलब है, कुछ ऐसा जो जेनेटिक एल्गोरिदम का उपयोग करता है जो क्लाउड कंप्यूटर पर क्लाउड गणना करता है? –

+0

संभावित डुप्लिकेट [जांचें कि केवल एक सिंगल बिट एक पूर्णांक के भीतर सेट है (जो भी इसकी स्थिति है)] (http: // stackoverflow।कॉम/प्रश्न/13420241/चेक-इफ-केवल-एक-एकल-बिट-सेट-इन-एन्टर-जो-इसकी स्थिति है) –

उत्तर

43
return x == (x & -x); 

इस उत्तर क्योंकि जिस तरह से दो के पूरक संकेतन बनाया गया है की काम करता है।

सबसे पहले, एक उदाहरण। मान लें कि हमारे पास 8-बिट हस्ताक्षरित पूर्णांक हैं।

00010000 = 16 
11110000 = -16 

बिटवाइज़ और आप 00010000 एक परिणाम के रूप, अपने मूल मूल्य के बराबर दे देंगे! कारण यह है कि यह काम करता है क्योंकि 2 के पूरक में नकारात्मक होने पर, पहले सभी बिट्स को उलटा करते हैं, फिर 1. जोड़ें। आपके पास शून्य का गुच्छा होगा और जब तक कोई एक स्थान न हो जाए तब तक कैर्री का एक गुच्छा होगा। बिटवाई और फिर जांचता है कि क्या हमारे पास सही बिट सेट है।

एक संख्या है कि दोनों में से एक शक्ति नहीं है के मामले में:

00101010 = 42 
& 11010110 = -42 
---------- 
    00000010 != 42 

आपका परिणाम अभी भी केवल एक ही सा होगा, लेकिन यह मूल मान से मेल नहीं होंगे। इसलिए आपके मूल मूल्य में कई बिट सेट थे।

नोट: यह तकनीक 0 के लिए सच होती है, जो वांछित हो सकती है या नहीं भी हो सकती है।

+2

प्रूफरीडिंग, बिल के लिए धन्यवाद! – MikeD

+5

आपको 'x> 0' के लिए भी परीक्षण करने की आवश्यकता है, क्योंकि यह अभिव्यक्ति 'x == 0' के लिए सच होती है, लेकिन 0 2 की शक्ति नहीं है। –

+0

बस सावधान रहें, यह 0 के लिए काम नहीं करेगा, आपको आवश्यकता है इसे अपने आप से संभालने के लिए –

24

यह एक प्रसिद्ध समस्या विकी से 2 की

(x & x-1) == 0 

पावर है: here

64 = 01000000 (x) 
63 = 00111111 (x-1) 
______________ 
& = 00000000 == 0 
______________ 

मामला जब कुछ अन्य बिट्स पर

18 = 00010010 (x) 
17 = 00010001 (x-1) 
______________ 
& = 00010000 != 0 
______________ 
+1

किनारे के मामले का ख्याल रखना जहां x! = 0 – yesraaj

+0

@yesraaj: – bragboy

+2

का ख्याल रखना माफ करना मेरा मतलब था कि x = 0 -> x और (x - 1) -> 0, तो गलत के बजाय यह सच हो जाता है! – yesraaj

0

हैं 2 आधार पर लॉग लो आपकी संख्या का, यदि यह एक पूर्णांक है तो आपके नंबर में केवल 1 1 बिट है। सुनिश्चित नहीं है कि मुझे लगता है कि यह आपके किसी भी बहिष्कृत विकल्पों से बेहतर है।

1
return (x && (0x8000000000000000ULL % x)); 

यह निम्नलिखित कोड का सरलीकरण है:

if (x == 0) { 
    return false; 
} else if (0x8000000000000000ULL % x) { 
    return false; 
} else { 
    return true; 
} 

स्पष्टीकरण: 0x8000000000000000 उच्चतम "1 बिट केवल" एक 64 बिट रजिस्टर के लिए मूल्य है। केवल एक अन्य "1 बिट केवल" मूल्य से एक विभाजन का परिणाम शेष नहीं होगा।

संबंधित मुद्दे