बहुत दिलचस्प सवाल, और चालाक चाल।
आइए एक एकल बाइट में हेरफेर करने के एक सरल उदाहरण को देखें। सरलता के लिए अहस्ताक्षरित 8 बिट का उपयोग करना। कल्पना कीजिए कि आपका नंबर है xxaxxbxx
और आप चाहते हैं ab000000
।
समाधान में दो चरण शामिल थे: थोड़ा सा मास्किंग, उसके बाद गुणन। बिट मास्क एक सरल और ऑपरेशन है जो निर्बाध बिट्स को शून्य में बदल देता है। उपरोक्त मामले में, आपका मुखौटा 00100100
और परिणाम होगा 00a00b00
।
अब कठिन हिस्सा: में बदल रहा है ab......
।
गुणन शिफ्ट-एंड-ऐड ऑपरेशन का एक गुच्छा है। कुंजी ओवरफ्लो को "दूर हटने" की अनुमति देने की है, बिट्स की हमें ज़रूरत नहीं है और जिन्हें हम चाहते हैं उन्हें सही जगह पर रखें।
4 से गुणा ( 00000100
) 2 के द्वारा छोड़ी गई सभी चीजों को शिफ्ट कर देगा और आपको प्राप्त करेगा a00b0000
। प्राप्त करने के लिए b
ऊपर ले जाने के हम 1 से गुणा करने के लिए (सही जगह में एक रखने के लिए) 4 (ख ऊपर ले जाने के) की जरूरत है। यह योग 5 है, और पहले के 4 के साथ संयुक्त होकर हमें 20 या एक जादुई संख्या मिलती है 00010100
। मूल 00a00b00
मास्किंग के बाद था ; गुणन देता है:
000000a00b000000
00000000a00b0000 +
----------------
000000a0ab0b0000
xxxxxxxxab......
इस दृष्टिकोण से आप बड़ी संख्या और अधिक बिट्स तक बढ़ा सकते हैं।
आपके द्वारा पूछे गए प्रश्नों में से एक था "क्या यह किसी भी संख्या में बिट्स के साथ किया जा सकता है?" मुझे लगता है कि उत्तर "नहीं" है, जब तक कि आप कई मास्किंग ऑपरेशन या कई गुणा की अनुमति नहीं देते हैं। समस्या "टकराव" का मुद्दा है - उदाहरण के लिए, ऊपर की समस्या में "आवारा बी"। कल्पना कीजिए कि हमें इस तरह की संख्या के लिए ऐसा करने की आवश्यकता है xaxxbxxcx
। पहले के दृष्टिकोण के बाद, आपको लगता है कि हमें {x 2, x {1 + 4 + 16}} = x 42 (oooh - हर चीज का जवाब!) चाहिए। परिणाम:
00000000a00b00c00
000000a00b00c0000
0000a00b00c000000
-----------------
0000a0ababcbc0c00
xxxxxxxxabc......
जैसा कि आप देख सकते हैं, यह अभी भी काम करता है, लेकिन "केवल"। वे यहाँ कुंजी यह है कि बिट्स के बीच "पर्याप्त जगह" है जो हम चाहते हैं कि हम सब कुछ निचोड़ सकते हैं। मैं ग के बाद एक चौथाई बिट डी नहीं जोड़ सका, क्योंकि मुझे ऐसे उदाहरण मिलेंगे जहां मुझे सी + डी मिलता है, बिट्स ले जा सकता है, ...
तो औपचारिक प्रमाण के बिना, मैं आपके प्रश्न के अधिक दिलचस्प भागों का उत्तर निम्नानुसार दूंगा: "नहीं, यह किसी भी संख्या में बिट्स के लिए काम नहीं करेगा। एन बिट्स निकालने के लिए, आपको बिट्स के बीच रिक्त स्थान (एन -1) की आवश्यकता होती है। अतिरिक्त मास्क लगाएं, या निकालें। "
एकमात्र अपवाद मैं "बिट्स (एन -1) बिट्स के बीच शून्य" के लिए सोच सकता हूं, यह नियम है: यदि आप दो बिट्स निकालना चाहते हैं जो मूल में एक दूसरे से सटे हैं, और आप उन्हें रखना चाहते हैं उसी क्रम में, फिर भी आप कर सकते हैं। और (N-1) नियम के उद्देश्य के लिए वे दो बिट्स के रूप में गिने जाते हैं।
एक और अंतर्दृष्टि है - नीचे दिए गए @Ternary के उत्तर से प्रेरित है (मेरी टिप्पणी देखें)। प्रत्येक दिलचस्प बिट के लिए, आपको इसके सही भाग के लिए केवल उतने ही शून्य की आवश्यकता है जितनी आपको बिट्स के लिए जगह की आवश्यकता होती है जो वहां जाने की आवश्यकता होती है। लेकिन यह भी, यह बाईं ओर के रूप में कई बिट्स की जरूरत है क्योंकि यह बाईं ओर परिणाम बिट्स है। इसलिए यदि थोड़ा b n की स्थिति में समाप्त होता है, तो इसके दाईं ओर m-1 शून्य होना चाहिए, और इसके दाईं ओर nm शून्य होना चाहिए। विशेष रूप से जब बिट्स मूल संख्या में समान क्रम में नहीं होते हैं जैसा कि वे पुन: आदेश देने के बाद होंगे, यह मूल मानदंडों में एक महत्वपूर्ण सुधार है। इसका मतलब है, उदाहरण के लिए, कि एक 16 बिट शब्द
a...e.b...d..c..
में शिफ्ट किया जा सकता है
abcde...........
भले ही ई और बी के बीच केवल एक स्थान है, दो डी और सी के बीच, तीन अन्य के बीच। N-1 को जो भी हुआ ?? इस मामले में, a...e
"एक ब्लॉक" बन जाता है - उन्हें सही स्थान पर 1 से गुणा करने के लिए गुणा किया जाता है, और इसलिए "हमें मुफ्त में ई मिला"। बी और डी के लिए एक ही सही है (बी को दाईं ओर तीन रिक्त स्थान की आवश्यकता है, डी को इसके बाईं ओर तीन की आवश्यकता है)। इसलिए जब हम जादू की संख्या की गणना करते हैं, तो हम पाते हैं कि डुप्लिकेट हैं:
a: << 0 ( x 1 )
b: << 5 ( x 32 )
c: << 11 ( x 2048 )
d: << 5 ( x 32 ) !! duplicate
e: << 0 ( x 1 ) !! duplicate
स्पष्ट रूप से, यदि आप इन नंबरों को एक अलग क्रम में चाहते हैं, तो आपको उन्हें आगे रखना होगा। हम (N-1)
नियम में सुधार कर सकते हैं : "यह हमेशा काम करेगा यदि बिट्स के बीच कम से कम (एन -1) रिक्त स्थान हैं, या, यदि अंतिम परिणाम में बिट्स का क्रम ज्ञात है, तो यदि स्थिति बी में स्थिति बी थोड़ा समाप्त हो जाती है n, इसके बाईं ओर m-1 शून्य और इसके दाईं ओर nm शून्य होना आवश्यक है। "
@ टर्नेरी ने बताया कि यह नियम काफी काम नहीं करता है, क्योंकि बिट्स से एक कैरी जोड़ा जा सकता है "बस लक्ष्य क्षेत्र के दाईं ओर" - जब हम जिस बिट की तलाश कर रहे हैं वे सभी हैं। उदाहरण को जारी रखते हुए मैंने 16 बिट शब्द में पाँच कसकर भरे हुए बिट्स के साथ ऊपर दिया: यदि हम साथ शुरू करते हैं
a...e.b...d..c..
सादगी के लिए, मैं थोड़ा पदों का नाम दूंगा ABCDEFGHIJKLMNOP
हम जो गणित करने जा रहे थे, वह था
ABCDEFGHIJKLMNOP
a000e0b000d00c00
0b000d00c0000000
000d00c000000000
00c0000000000000 +
----------------
abcded(b+c)0c0d00c00
अब तक, हमने सोचा था कि नीचे कुछ भी abcde
(स्थिति ABCDE
) कोई फर्क नहीं पड़ेगा, लेकिन वास्तव में, जैसा कि @Ternary ने बताया है, अगर b=1, c=1, d=1
तब (b+c)
स्थिति में स्थिति G
को ले जाने के लिए थोड़ा कारण होगा F
, जिसका अर्थ है कि (d+1)
स्थिति F
में थोड़ा सा ले जाएगा E
- और हमारे रिजल्ट खराब हुआ ध्यान दें कि ब्याज के कम से कम महत्वपूर्ण बिट के स्थान पर ( c
इस उदाहरण में) कोई फर्क नहीं पड़ता, क्योंकि गुणन कम से कम महत्वपूर्ण बिट से ज़ोनोस के साथ पैडिंग का कारण होगा।
इसलिए हमें अपने (एम -1) / (एनएम) नियम को संशोधित करने की आवश्यकता है। यदि एक से अधिक बिट है जिसमें "बिल्कुल (nm) अप्रयुक्त बिट्स दाईं ओर है (पैटर्न में अंतिम बिट की गिनती नहीं है - ऊपर उदाहरण में" c "), तो हमें नियम को मजबूत करने की आवश्यकता है - और हमें करना होगा ऐसा करने के लिए!
हमें न केवल उन बिट्स की संख्या को देखना होगा जो (nm) कसौटी पर खरे उतरते हैं, बल्कि वे भी हैं जो (n-m + 1) आदि हैं, आइए उनकी संख्या Q0 (ठीक n-m
अगले बिट तक), Q1 को कॉल करें ( n-m + 1), Q (N-1) (n-1) तक। फिर हम जोखिम उठाते हैं यदि
Q0 > 1
Q0 == 1 && Q1 >= 2
Q0 == 0 && Q1 >= 4
Q0 == 1 && Q1 > 1 && Q2 >=2
...
यदि आप इसे देखते हैं, तो आप देख सकते हैं कि यदि आप एक सरल गणितीय अभिव्यक्ति लिखते हैं
W = N * Q0 + (N - 1) * Q1 + ... + Q(N-1)
और परिणाम यह है W > 2 * N
, तो आपको आरएचएस मानदंड को एक बिट तक बढ़ाने की आवश्यकता है (n-m+1)
। इस बिंदु पर, जब तक ऑपरेशन सुरक्षित है W < 4
; यदि वह काम नहीं करता है, तो मानदंड को एक और बढ़ाएं, आदि।
मुझे लगता है कि उपरोक्त का अनुसरण करने से आपको अपने उत्तर के लिए एक लंबा रास्ता मिल जाएगा ...