2010-07-16 21 views
18

मैं एक प्रोग्राम है जो निम्नलिखित समारोह में शामिल है, जो हैयह फ़ंक्शन क्या करता है?

int f(int n) { 
    int c; 
    for (c=0;n!=0;++c) 
     n=n&(n-1); 
    return c; 
} 

मैं काफी इस समारोह कर करने का इरादा है क्या समझ में नहीं आता पढ़ रहा हूँ?

+44

जो दिखाता है कि 'f' इस फ़ंक्शन के लिए एक भयानक नाम है। –

+1

एक टिप्पणी या दो को चोट नहीं पहुंचीगी, या तो। –

+3

कोड खराब दिखता है, लेकिन 30 सेकंड के बाद यह सुरुचिपूर्ण दिखाई देता है। और कुशल। "सी प्रोग्रामर अपने पहचानकर्ताओं में अधिक इरादा क्यों नहीं रखते हैं?" का एक अच्छा उदाहरण है क्योंकि वे शक्तिशाली होने के लिए पर्याप्त क्रिप्टिक होना पसंद करते हैं। " – TheBlastOne

उत्तर

33

यह counts number of 1's n के द्विआधारी प्रतिनिधित्व में

+7

मुझे यह पसंद है कि यह पूछने की आवश्यकता नहीं होगी कि फ़ंक्शन को 'f' के बजाय 'countBinaryOnes' कहा गया था या नहीं। इसके अलावा, +1। – Cam

+0

+1। यहां 2 ए देखें - http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/ – Dummy00001

+1

कोडिंग लालित्य: ए +। कोडिंग स्पष्टता: एफ – Jay

3

यह बाइनरी का उपयोग करके n0 को कम करने के लिए किए गए पुनरावृत्तियों की संख्या की गणना करता है।

+0

हां, लेकिन पुनरावृत्ति की संख्या उस पर निर्भर है: पी Vlad ने इसे मारा। –

+0

उत्तर सबसे अधिक 1: n और 0 – Amnon

+3

@ निक पर है; अच्छी बात। मैंने उस स्पष्टीकरण के बारे में नहीं सोचा था, इसलिए मैं इरादे की बजाय यांत्रिकी का वर्णन कर रहा था। –

0

यह हो सकता है यह n में महत्वपूर्ण बिट की संख्या लौटने की कोशिश करता है? (इसे पूरी तरह से नहीं सोचा है ...)

+0

हालांकि मुझे लगता है कि @ व्लादिमीर का जवाब तकनीकी रूप से सटीक है, मुझे यह स्पष्टीकरण सबसे अच्छा लगता है। – Randolpho

+2

@ रैंडोल्फो क्या? यह जवाब गलत है। 0b1000 इनपुट को देखते हुए यह 1, 4 नहीं (महत्वपूर्ण बाइनरी अंकों की संख्या - बिट्स) की संख्या –

+0

महत्वपूर्ण बिट्स का क्या अर्थ है? – Amnon

10

यह दिखाने का इरादा है कि टिप्पणियां कितनी महत्वपूर्ण हैं।

+14

नहीं, यह स्पष्ट रूप से नहीं है। यह दिखाने का इरादा है कि अच्छे फ़ंक्शन नाम कितने महत्वपूर्ण हैं। –

+2

एक वर्णनात्मक फ़ंक्शन नाम को एक टिप्पणी माना जा सकता है। – JeremyP

+3

@ जेरेमीपी: नहीं। – Cam

0

यह एक आंतरिक/इनलाइन असेंबलर निर्देश का उपयोग करके प्रोग्राम (x86 निर्देश सेट के लिए) प्रोग्राम नहीं करना है, इस तरह से कुछ आसान पढ़ने के लिए तेज़ और बेहतर है। (लेकिन यह एक x86 आर्किटेक्चर के लिए केवल सच है, जहां तक ​​मुझे पता है, मुझे नहीं पता कि यह एआरएम या एसपीएआरसी या कुछ और के बारे में कैसा है)

+1

असेंबली निर्देश क्या है जो इसे Freescale HCS08 पर करता है? : पी –

+0

मुझे लगता है कि आपको थोड़ा और औचित्य देने की आवश्यकता है। – BobbyShaftoe

4

यह पीओपीसीएनटी निर्देश की कमी के लिए एक (अब अप्रचलित) कामकाज है गैर सैन्य सीपीयू में।

5

फ़ंक्शन को एन के प्रतिनिधित्व में बिट्स की संख्या वापस करने के लिए प्रेरित किया गया है। अन्य उत्तरों में क्या चूक गया है, यह है कि फ़ंक्शन तर्क 0 n0. तर्कों के लिए अपरिभाषित व्यवहार का आह्वान करता है। ऐसा इसलिए है क्योंकि फ़ंक्शन कम से कम उच्चतम से शुरू होने पर संख्या को एक बार दूर करता है। नकारात्मक संख्या के लिए इसका मतलब है कि लूप समाप्त होने से पहले एन का अंतिम मान (2-पूरक में 32-बिट पूर्णांक के लिए) 0x8000000 है। यह संख्या INT_MIN है और यह अब आखिरी बार पाश में प्रयोग किया जाता है:

n = n&(n-1) 

दुर्भाग्य से, INT_MIN -1 एक अतिप्रवाह है और अतिप्रवाह अपरिभाषित व्यवहार आह्वान। पूर्णांक को "चारों ओर लपेटने" के लिए एक अनुरूप कार्यान्वयन की आवश्यकता नहीं है, उदाहरण के लिए यह एक ओवरफ्लो जाल जारी कर सकता है या सभी प्रकार के अजीब परिणाम छोड़ सकता है।

+1

एक हस्ताक्षरित मात्रा में सेट बिट्स की गणना करना आमतौर पर ऐसा नहीं होता है जिसे आप वैसे भी करना चाहते हैं। फ़ंक्शन को केवल 'हस्ताक्षरित int' स्वीकार करना चाहिए। –

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