2016-02-29 13 views
6

this पद है, जो हाल ही में upvotes के कुछ उल्लेखनीय गुच्छा प्राप्त हुआ है, सी
में + ऑपरेटर के बारे में पूछ यह पता चलता है नहीं है निम्नलिखित कार्यान्वयन:क्या यह पूर्ण योजक कार्यान्वयन सही है?

// replaces the + operator 
int add(int x, int y) { 
    while(x) { 
     int t = (x & y) <<1; 
     y ^= x; 
     x = t; 
    } 
    return y; 
} 

संयोगवश, मैं एक कार्यान्वयन अपने आप को भी लिखा था (एक एल्गोरिदम पुस्तक अभ्यास) और उसके साथ आया:

uint32_t bit_add(uint16_t a, uint16_t b) { 
    uint32_t carry = ((uint32_t) a & b) << 1; 
    uint16_t add = a^b; 

    return carry^add; 
} 

मैंने इसे दो बार परीक्षण किया और ऐसा लगता है। बात यह है कि, संदर्भित पोस्ट से कार्यान्वयन की तुलना में यह काफी तेज है, जिसमें x86 पर किसी भी कूद की कमी है।

क्या मेरा कार्यान्वयन सही है या क्या कुछ गड़बड़ है जिसके बारे में मुझे पता नहीं है?
मैं कल्पना नहीं कर सकता कि मेरे कोड को एक पोस्ट के कोड से तेज़ होना चाहिए, जिसे अक्सर देखा और समीक्षा की जाती है।

+0

मैंने जांच नहीं की, लेकिन यह सही हो सकता है। मान लें कि लोग हर समय सबसे कुशल कोड लिखते हैं; इन सभी उत्तरों को खिलौनों की समस्याओं के लिए या प्रदर्शन उद्देश्यों के लिए बनाया गया था, वास्तविक उपयोग के लिए नहीं (+ अभी भी तेज है)। – Cubic

+0

दो उदाहरण differents हैं, पहले लूप में प्रति निर्देश एक बिट संचालित करता है, आपके सभी बिट प्रभावित होते हैं। कंपाइलर भी आपके कोड को अनुकूलित कर सकता है। – purplepsycho

+0

3 और 7 जोड़ने का प्रयास करें, यह आउटपुट 2. – Kenney

उत्तर

6

आपका कार्य काम नहीं करता है।

एक साधारण counterexample 127 + 1.

यह देखना आसान है है। संख्या 127 में सभी महत्वपूर्ण 7 बिट्स 1 से सेट नहीं होते हैं। And इसे नंबर 1 के साथ जोड़ते हैं, और इसे बाईं ओर स्थानांतरित करते हैं, तो मूल्य 2 प्रदान करेंगे। तब से, ऑपरेटर xor का उपयोग करके, हमारे द्वारा उपलब्ध मानों का कोई संयोजन उपलब्ध नहीं है , 127 से बड़ा मान का उत्पादन कर सकता है।

+0

बकवास, आप सही हैं। क्या आप समझा सकते हैं क्यों?मैं पहले से ही डीबगिंग शुरू करने जा रहा हूं लेकिन एक स्पष्टीकरण एक बेहतर जवाब के लिए भी होगा, आईएमओ ... – Downvoter

+0

@ कैड आप अपने 'ऐड' और 'कैरी' को सही तरीके से गणना करते हैं लेकिन 'रिटर्न' कथन में आपने गलती की है! यही वह जगह है जहां आपको ** लूप ** – Lrrr

+0

@ कैड अपडेट चाहिए। – 2501

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