2012-09-18 9 views
14

को निर्धारित किया है अगर मैं एक bitboard है और मैं सी में जाँच करना चाहते हैं यदि केवल एक बिट करने के लिए 1.टेस्ट एक bitboard केवल एक बिट 1

#include <stdint.h> 
typedef uint64_t bboard; 
bboard b = 0x0000000000000010; 
if (only_one_bit_set_to_one (b)) // in this example expected true 
    // do something... 

सेट किसी भी विचार समारोह int only_one_bit_set_to_one (bboard b) लिखने के लिए है?

+0

संभावित डुप्लिकेट [कैसे जांचें कि कोई संख्या 2 की शक्ति है या नहीं) (http://stackoverflow.com/questions/600293/how-to-check-if-a-number-is-a-power- ऑफ -2) –

+0

संभावित डुप्लिकेट [जांचें कि केवल एक सिंगल बिट एक पूर्णांक के भीतर सेट है (जो भी इसकी स्थिति है)] (http://stackoverflow.com/questions/13420241/check-if-only-one-single-bit -इस-सेट-इन-ए-इंटीजर-जो भी इसकी स्थिति है) –

उत्तर

38

ज़रूर, यह आसान है:

int only_one_bit_set_to_one (bboard b) 
{ 
    return b && !(b & (b-1)); 
} 

कहो b किसी भी बिट्स सेट है, कम से कम महत्वपूर्ण बिट संख्या k है। b-1 से ऊपर सूचकांक के लिए b के समान बिट्स k और कम महत्वपूर्ण स्थानों में 1-बिट्स के साथ समान बिट्स है, इसलिए बिटवाई और b से कम से कम महत्वपूर्ण सेट बिट हटा देता है। यदि b में केवल एक बिट सेट था, तो परिणाम 0 हो जाता है, यदि b अधिक बिट्स सेट किया गया था, तो परिणाम nonzero है।

+2

आह, पुरानी "दो की शक्ति है" एल्गोरिदम –

+0

बहुत बहुत धन्यवाद! और क्या आप मुझे बता सकते हैं कि सभी 1 बिट अजीब या यहां तक ​​कि पदों में हैं या नहीं? – Pioz

+1

एक्सओआर एक मुखौटा के साथ कहता है जिसमें सभी अजीब बिट पोजिशन 1 पर सेट होते हैं, उसके बाद एक ही मास्क के साथ, और परिणाम मास्क के बराबर होता है, तो बिट एक अजीब स्थिति में नहीं था (मुझे लगता है) ... –

2

इसमें कुछ समय अनुभवहीन हो सकता है, लेकिन मैं 0 से 63 के पाश चाहते, प्रासंगिक बिट को साफ करें और देखें कि क्या परिणाम 0 है:

if (b != 0) { 
    for (i = 0; i < 64; ++i) { 
     if (b & ~(1 << i)) == 0) { 
      return 1; 
     } 
    } 
    return 0; 
} 

यह अन्य के रूप में के रूप में चतुर पोस्ट के पास कहीं भी नहीं है जवाब, लेकिन यह समझने में आसान होने का लाभ है।

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