किसी बाहरी काउंटर या अन्य राज्य का उपयोग किए बिना, मैं कुशल फ़ंक्शन ढूंढ रहा हूं जो एक एन-बिट मान (32 बिट्स या वहां) लेता है और बाद में मान Gray code में देता है।ग्रे कोड वृद्धि फ़ंक्शन
यही कारण है:
int fn(int x)
{
int y = gray_to_binary(x);
y = y + 1;
return binary_to_gray(y);
}
लेकिन जब binary_to_gray()
समारोह तुच्छ है (x^(x >> 1)
), इसी gray_to_binary()
(log(n)
पुनरावृत्तियों की एक पाश) सब पर इतना तुच्छ नहीं है।
शायद संचालन का एक और अधिक कुशल अनुक्रम है? या तो मानक प्रतिबिंबित ग्रे कोड के लिए, या इस समस्या के अनुरूप चुने गए किसी अन्य ग्रे कोड के लिए। (या एक अधिक कुशल रूपांतरण प्रदर्शन करने के लिए एक एक कोड आसान है कि द्विआधारी कन्वर्ट करने के लिए और फार्म ऊपर दिए गए उपयोग करने के लिए चयन करने के लिए है - मैं इस समस्या में दो संभव समाधान प्रकार भी देखें:
एक तरफ प्रतिबिंबित कोड के लिए बाइनरी), और दूसरा बाइनरी में रूपांतरण को स्थगित करना और एक विधि उत्पन्न करना है जो बाइनरी वृद्धि के उपयोग के बिना ग्रे कोड के माध्यम से चलता है।
बाद के मामले में, परिणामस्वरूप कोड को बाइनरी में परिवर्तित करना विशेष रूप से कठिन हो सकता है। यह व्यावहारिक शर्तों में नीचे की तरफ है, लेकिन यह अभी भी देखना दिलचस्प बात होगी।
अद्यतन: के बाद से यह बताया गया है कि ग्रे डिकोड केवल log(n)
परिचालन (दो विभिन्न तकनीकों का उपयोग करने वाली) है, मैं यह पता लगाने की है कि अगर कितनी दूर पर एक सख्त सीमा है की कोशिश कर कुछ समय बिताया चीजों को सरल बनाया जा सकता है। प्रदर्शन करने के लिए अगले ऑपरेशन का निर्धारण करते समय सभी बिट्स पर विचार किया जाना चाहिए, अन्यथा 'माना' बिट्स बदलने में असफल हो जाएंगे और फ़ंक्शन दो मानों के बीच आ जाएगा। प्रदर्शन करने के लिए अगले ऑपरेशन को निर्धारित करने के लिए इनपुट को किसी भी तरह से एक प्रबंधित पैमाने पर संपीड़ित किया जाना चाहिए।
यह log(n-k)
संचालन करने के लिए, एक 2 कश्मीर -entry lut (एक टिप्पणी से पता चलता है k=32
) लघु कटौती पिछले k
संचालन के लिए इस्तेमाल किया जा सकता है।
एक और तकनीक जो दिमाग में आई थी जो अक्सर चीजों को बहुत जल्दी कम कर सकती है गुणा और बिटमैस्क का संयोजन है। उदाहरण के लिए, समानता-आधारित एल्गोरिदम लागू करने के लिए parity की गणना करने के लिए।
गुणा-और-बिटमास्क दृष्टिकोण से, ऐसा लगता है कि ग्रे कोड का आविष्कार करने के लिए जगह हो सकती है जो संचालन के सेट को और भी सरल बनाता है ... लेकिन मुझे कल्पना नहीं है कि ऐसा कोई कोड ज्ञात है।
ग्रे से बाइनरी में कनवर्ट कर रहा से केवल '' लॉग रखना चाहिए (एन) कदम, नहीं ' n'। 'X^= x >> 1 की तरह; एक्स^= एक्स >> 2; एक्स^= एक्स >> 4; x^= x >> 8; 'आदि – harold
ऐसा लगता है [" मैटर्स कम्प्यूटेशनल "] (http://www.jjj.de/fxt/), अध्याय 1.16.3 (" ग्रे कोड में वृद्धि (गिनती) ") एक समाधान का प्रस्ताव है जो इस समस्या के लिए उपयुक्त हो सकता है। –
यदि आपके पास बहुत मेमोरी (16GByte) है, तो बस एक सरणी 'int [2^32] gray2binary' बनाएं जहां आप ग्रेकोड का उपयोग इंडेक्स के रूप में करते हैं और बाइनरी कोड को arrayEntry के मान के रूप में प्राप्त करते हैं। **; -) ** – MrSmith42