2011-01-16 8 views
8

संभावित डुप्लिकेट:
How do you set, clear and toggle a single bit in C?
Removing lowest order bitअनसेट सबसे दायीं ओर का सेट बिट

n एक सकारात्मक पूर्णांक है। इसका सही सेट थोड़ा कैसे सेट हो सकता है?

कहो n = 7 => एन = 0111. मैं 0110 आउटपुट के रूप में चाहते हैं। लक्ष्य प्राप्त करने के लिए कोई आसान bitwise हैक है?

उत्तर

18

n & (n-1) प्रयास करें जहां & (वन द्वारा दिए गए टिप्पणी के जवाब में) bitwise AND

n = 7 
n - 1 =6 

n & (n-1)=> 0 1 1 1 (7) 
      & 0 1 1 0 (6) 
      --------- 
      0 1 1 0 (done!) 

संपादित है

n = 6 
n - 1 = 5 

n & (n-1)=> 0 1 1 0 (6) 
      & 0 1 0 1 (5) 
      --------- 
      0 1 0 0 (done!) 
+1

@taspeotis: फिर से सवाल देखें "इसका सही ** सेट ** बिट कैसे सेट हो सकता है?" –

+0

आह, हाँ। मैंने "सेट" शब्द को नजरअंदाज कर दिया। –

+4

+1 अच्छा! मैं अभी भी समझ में नहीं आता कि लोग इस तरह के समाधान कैसे जल्दी देखते हैं। – Dawson

0
unsigned int clr_rm_set_bit(unsigned int n) 
{ 
    unsigned int mask = 1; 
    while(n & mask) { 
     mask <<= 1; 
    } 
    return n & ~mask; 
} 
+1

यह ओ (एन) है जबकि प्रसून ओ (1) है। इसके अलावा, आप कुछ और चाहते हैं 'जबकि (! (एन एंड मास्क)), लेकिन यह भी 'n = 0' के लिए काम नहीं करता है। –

+1

असल में यह विधि (जब सही ढंग से लागू होती है) 'ओ (एन) 'नहीं है। यह 'ओ (लॉग (एन)) 'है। और चूंकि एन एक हस्ताक्षरित int के आकार से बंधे हैं, इसलिए आप इसे ओ (1) भी कह सकते हैं। – Artelius

+0

दाएं, एन == 0 और एन

4

आपका प्रश्न स्पष्ट नहीं है।

तुम सिर्फ सेट नहीं बिट 0 चाहते हैं, यहाँ कुछ तरीके (व्यवहार में मामूली बदलाव के साथ शामिल अपने प्रकार के आधार पर) कर रहे हैं:

x &= -2; 
x &= ~1; 
x -= (x&1); 

आप बिट्स हैं कि में सबसे कम बिट अनसेट चाहते हैं सेट, यहाँ कुछ तरीके हैं:

x &= x-1; 
x -= (x&-x); 

ध्यान दें कि x&-xx का सबसे कम बिट के बराबर है, कम से कम जब x अहस्ताक्षरित है या दुक्की पूरक। यदि आप इस तरह के कुछ अंकगणित करना चाहते हैं, तो आपको केवल हस्ताक्षरित प्रकारों का उपयोग करना चाहिए, क्योंकि हस्ताक्षरित प्रकारों में बिटवाईड ऑपरेशंस के तहत कार्यान्वयन-परिभाषित व्यवहार है।

+5

"सही सेट बिट" पूरी तरह से स्पष्ट लगता है। यह सिर्फ एक खराब चुना गया उदाहरण था। –

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