2009-11-19 9 views
8

के एकाधिक से अधिक गोल करें क्या कोई यह बता सकता है कि यह कैसे काम करता है (asz + 7) & ~ 7; यह 0 के उच्चतम एकाधिक के लिए एएसजे को बंद करता है।बिट हैक - 8

यह देखना आसान है कि ~ 7 11111000 (8 बिट प्रतिनिधित्व) उत्पन्न करता है और इसलिए पिछले 3 बिट्स को बंद कर देता है, इस प्रकार उत्पादित कोई भी संख्या 8 का एक बहु है

मेरा सवाल यह है कि मास्किंग [संपादित करें] अगले उच्च [अंत संपादन] 8 के एकाधिक उत्पादन का उत्पादन करने से पहले 7 को एज़ जोड़ना कैसा है? मैं इसे लिखने की कोशिश की कागज पर नीचे

की तरह:

1 + 7 = 8 = 1|000 (& ~7) -> 1000 
2 + 7 = 9 = 1|001 (& ~7) -> 1000 
3 + 7 = 10 = 1|010 (& ~7) -> 1000 
4 + 7 = 11 = 1|011 (& ~7) -> 1000 
5 + 7 = 12 = 1|100 (& ~7) -> 1000 
6 + 7 = 13 = 1|101 (& ~7) -> 1000 
7 + 7 = 14 = 1|110 (& ~7) -> 1000 
8 + 7 = 15 = 1|111 (& ~7) -> 1000 

एक पैटर्न स्पष्ट रूप से उभरने के लिए जो .can किसी कृपया मेरी मदद के लिए इसे बाहर का शोषण किया गया है लगता है?

उत्तर के लिए सभी को धन्यवाद। इससे मेरी पुष्टि करने में मदद मिली कि मैं क्या सोच रहा था। मैंने ऊपर दिए गए पैटर्न को लिखना जारी रखा और जब मैंने 10 पार किया, तो मैं स्पष्ट रूप से देख सकता था कि अगर मैं ऐसा कह सकता हूं तो अगले को "8 के ब्लॉक" में पदोन्नत किया जाता है।

फिर से धन्यवाद।

उत्तर

17

खैर, पूर्णांक बनाना अगर आप कोशिश कर रहे थे नीचे, आपको अतिरिक्त आवश्यकता नहीं होगी। बस मास्किंग चरण करने से नीचे बिट्स को साफ़ कर दिया जाएगा और आप अगले निचले एकाधिक में गोल हो जाएंगे।

यदि आप पर राउंड करना चाहते हैं, तो पहले आपको 8 के अगले एकाधिक "अतीत" के लिए पर्याप्त जोड़ना होगा। फिर उसी मास्किंग चरण आपको 8 के एकाधिक में वापस ले जाता है। कारण 7 आप चुनते हैं यह है कि यह केवल एकमात्र संख्या है जो आपको 8 के अगले एकाधिक से पहले किसी भी संख्या से प्राप्त करने के लिए "बड़ी पर्याप्त" होने की गारंटी देता है, यदि आपका मूल नंबर पहले से ही 8 से अधिक हो।

सामान्य रूप से, दो की शक्ति तक गोल करने के लिए:

unsigned int roundTo(unsigned int value, unsigned int roundTo) 
{ 
    return (value + (roundTo - 1)) & ~(roundTo - 1); 
} 
+1

किसी भी पूर्णांक मीटर के लिए एक पूर्णांक एन को गोल करने के लिए '(एन/एम) * एम' –

+1

के साथ हासिल किया जा सकता है '& ~' बिट केवल तभी काम करता है जब राउंड टॉ 2 की शक्ति हो। आम तौर पर आपको' वापसी (मूल्य) + राउंड टू - 1)/राउंड टू) * राउंड टू; 'इसके बजाए। –

+0

@ ग्रेग्रागर्स, क्या आपको कोई विचार है कि विभाजित निर्देश कितना महंगा है? – Johan

3

ठीक है, मुखौटा 8 से सटीक एकाधिक का उत्पादन करेगा। एएसजे में 7 जोड़ना सुनिश्चित करता है कि आपको अगले उच्च एकाधिक प्राप्त करें।

15

यह वास्तव में संख्या से ऊपर और गोल करने के लिए जोड़ रहा है।

इस 8. के ​​अगले कई से आगे निकलने के वांछित प्रभाव पड़ता है (+7 के बजाय +8 जोड़ना 8 16. के एक मूल्य टक्कर होगा)

+0

संयोग से यह चाल काम नहीं करेगी यदि आप जिस नंबर को एक से अधिक गोल करना चाहते हैं वह संख्या के आधार पर एकाधिक नहीं है। लघु संस्करण: आप 8 और राउंड 9 तक नहीं जोड़ सकते हैं, लेकिन आप 15 और राउंड 16 जोड़ सकते हैं। – Broam

+0

ब्रोम, मुझे जो कुछ भी कहा जा रहा है वह मुझे नहीं मिलता है। 8 जोड़ना और गोल करना ठीक काम करता है। – Joost

4

+7 एक सटीक एकाधिक उत्पादन नहीं करना है 8, यह सुनिश्चित करना है कि आपको आठ का अगला उच्चतम बहुतायत मिल जाए।

संपादित करें: 16 सेकंड तक बीटन और गुणवत्ता के कई आदेश। ओह ठीक है, वापस छिपाने के लिए।

0

उह, आपने अभी अपना प्रश्न उत्तर दिया है ??? 7 जोड़कर, आप गारंटी दे रहे हैं कि परिणाम 8 के अगले एकाधिक से ऊपर या ऊपर होगा। फिर आपको कई मिलते हैं।

1

+7 बिना यह 8 कम करने या अपने मूल संख्या

1

जोड़ना 7 8 की एक बहु 8 के कई के साथ anding द्वारा निर्मित है का उत्पादन नहीं करता के बराबर की सबसे बड़ी कई हो जाएगा ~ 7। ~ 7 7 का पूरक है, जो 0xffff fff8 है (हालांकि कई बिट्स एक int में हैं) को छोड़कर। यह truncates, या गोल नीचे।

यह बीमा करने से पहले 7 जोड़ना कि एएसजे से कम कोई मूल्य वापस नहीं किया गया है। आप पहले से ही काम कर चुके हैं कि यह कैसे काम करता है।

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