सी मापुलस का उपयोग कर


81

मुझे एक पेचीदा सी कोड आया है जो प्रिंट करता है A + B, लेकिन मुझे इसे समझने में परेशानी होती है।

इनपुट प्रारूप:

जहाँ A, Bबीच में पूर्णांक होते हैं 0और 10एक ही स्थान से अलग होते हैं ।

कोड:

यह शॉर्ट कोडिंग के लिए बनाया गया था, कृपया चेतावनियों को बुरा न मानें।

मैं अब तक क्या समझा:

gets( &n )निम्न तीन बाइट्स में A, space और B के ASCII मूल्यों को संग्रहीत करता है n। उदाहरण के लिए, A = 3और B = 8उपज होगी n = 0x00382033। दिए गए हालात nओवरफ्लो होने से रोकते हैं । लेकिन मुझे समझ नहीं आता कि n % 85 - 43पैदावार कैसे होती है A + B

आप इन नंबरों के साथ कैसे आते हैं?


2
वास्तव में घुसपैठ।
हेवनार्ड

12
एक संकेत यह है कि बाइनरी में 85 बारी-बारी से बिट्स हैं 01010101। यदि आप इस दृष्टिकोण के साथ प्रयास करते हैं 10101010, तो यह संख्या 170 है, आपको समान कार्यक्षमता मिलती है, एकमात्र अंतर यदि आप अपने साथ 0 0करते हैं तो इसके बजाय संख्या 128 मिलती है (जो कि 10000000बाइनरी में है)। ऐसा ही एक तकनीक जैसे मास्क का उपयोग कर इस तरह के एक बिट सेट में बिट्स की गिनती संख्या के रूप में बिटवाइज़ संचालन के साथ अनुकूलन का एक समूह ऐसा करने के लिए प्रयोग किया जाता है 0x55555555और 0xAAAAAAAA(0x55 = 85 और 0xAA = 170)। यदि आप उन हेक्साडेसिमल कोड को गूगल करते हैं तो आपको दिलचस्प लेखों का एक समूह मिलता है।
हेवनार्ड

वाह, मैंने 85 की संख्या में इस गहराई की कभी उम्मीद नहीं की थी। अंतर्दृष्टि के लिए धन्यवाद।
विलियम ली

1
मुझे लगता है कि आप 0 और 9 के बीच समावेशी हैं?
पाइप

1
यह निश्चित रूप से ioccc योग्य है।
डेगफ

जवाबों:


87

छोटे-एंडियन इन्ट्स (और ASCII टेक्स्ट, और 8-बिट बाइट्स, और अन्य सभी मान्यताओं के लिए कोड की आवश्यकता होती है) के साथ, और कोड में सभी तकनीकी-गलत-इन-आधुनिक-सी सामानों को अनदेखा करते हुए, आपका "आप क्या समझते हैं" अब तक "सही है।

gets(&n)पहले 3 बाइट्स में ए, अंतरिक्ष और बी के एएससीआईआई मूल्यों को संग्रहीत करेगा n। यह 4 वें बाइट में एक शून्य टर्मिनेटर भी संग्रहीत करेगा। उन लोगों के बाइट्स में उन ASCII मूल्यों भंडारण nमें परिणाम nमूल्य लेने B*256*256 + space*256 + A, जहां B, space, और Aइसी ASCII मूल्यों प्रतिनिधित्व करते हैं।

256 mod 85 1 है, इसलिए मॉड्यूलर अंकगणितीय के गुणों से,

संयोग से, 4-बाइट बिग-एंडियन इनट्स के साथ, हमें मिलता है

इसलिए जब तक हमारे पास 4-बाइट्स होते हैं, तब तक धीरज की बात नहीं होती है। (बड़ा या छोटा ints एक समस्या हो सकती है; उदाहरण के लिए, 8-बाइट ints के साथ, हमें इस बारे में चिंता करनी होगी nकि उस बाइट में getsक्या सेट नहीं है।)

अंतरिक्ष ASCII 32 है, और एक अंक चरित्र के लिए ASCII मूल्य 48 + अंक का मान है। परिभाषित aऔर bअंकों के संख्यात्मक मान के रूप में (अंकों के ASCII मूल्यों के बजाय), हमारे पास है

जहां अंतिम दो समतुल्य इस तथ्य पर भरोसा करते हैं कि aऔर b0 से 9 तक मान लेते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.