ROUND_UP
मैक्रो काम पूरा करने के लिए पूर्णांक विभाजन पर निर्भर है। यह केवल तभी काम करेगा जब दोनों पैरामीटर पूर्णांक हों। मुझे लगता है कि N
गोल करने की संख्या है और S
वह अंतराल है जिस पर इसे गोल किया जाना चाहिए। यही है, ROUND_UP(12, 5)
15 वापस आना चाहिए, क्योंकि 15 12 से 12 के पहले अंतराल है।
कल्पना कीजिए कि हम इसके बजाय गोल कर रहे थे। उस मामले में, मैक्रो बस होगा:
#define ROUND_DOWN(N,S) ((N/S) * S)
ROUND_DOWN(12,5)
10 वापसी होगी, क्योंकि पूर्णांक प्रभाग में (12/5)
2, और 2 * 5 से 10 है लेकिन हम ROUND_DOWN नहीं कर रहे हैं, हम ROUND_UP कर रहे हैं । तो हम पूर्णांक विभाजन करने से पहले, हम सटीकता खोने के बिना जितना भी कर सकते हैं उतना जोड़ना चाहते हैं। अगर हमने S
जोड़ा, तो यह लगभग हर मामले में काम करेगा; ROUND_UP(11,5)
बन जाएगा ((11 + 5)/5) * 5), और 16/5 पूर्णांक विभाजन में 3 है, हम 15 प्राप्त करेंगे।
समस्या तब आती है जब हम पहले से गोल किए गए नंबर को पास करते हैं एकाधिक निर्दिष्ट। ROUND_UP(10, 5)
15 लौटाएगा, और यह गलत है। तो एस जोड़ने के बजाय, हम एस -1 जोड़ते हैं। यह गारंटी देता है कि हम कभी भी "बाल्टी" को अनावश्यक रूप से कुछ नहीं दबाएंगे।
PAGE_
मैक्रोज़ को बाइनरी गणित के साथ करना है। हम दिखाएंगे कि हम सादगी के लिए 8-बिट मानों से निपट रहे हैं। आइए मान लें कि PAGE_SIZE
0b00100000
है। PAGE_SIZE-1
इस प्रकार 0b00011111
है। ~(PAGE_SIZE-1)
तब 0b11100000
है।
एक बाइनरी &
दो बाइनरी संख्याएं लाइन करेगा और 1 को कहीं भी छोड़ देगा कि दोनों संख्याओं में 1 था।इस प्रकार, यदि x
0b01100111 था, आपरेशन इस तरह जाना होगा:
0b01100111 (x)
& 0b11100000 (~(PAGE_SIZE-1))
------------
0b01100000
आप ध्यान दें हूँ कि आपरेशन वास्तव में केवल ध्यान केंद्रित किया बाहर पिछले 5 बिट्स। बस इतना ही। लेकिन यह वास्तव में उस ऑपरेशन को PAGE_SIZE
के निकटतम अंतराल तक पहुंचने की आवश्यकता थी। ध्यान दें कि यह केवल काम करता है क्योंकि PAGE_SIZE
वास्तव में 2 की शक्ति थी। यह कहने की तरह थोड़ा सा है कि किसी भी मनमाना दशमलव संख्या के लिए, आप पिछले दो अंकों को शून्य करके केवल निकटतम 100 तक जा सकते हैं। यह पूरी तरह से काम करता है, और वास्तव में करना आसान है, लेकिन अगर आप 76 के निकटतम एकाधिक में घूमने की कोशिश कर रहे थे तो काम नहीं करेंगे।
PAGE_ROUND_UP
वही काम करता है, लेकिन यह जितना हो सके उतना जोड़ता है इसे काटने से पहले पेज। यह थोड़े तरह की है कि मैं किसी भी संख्या में 99 जोड़कर और पर अंतिम दो अंकों को शून्य करके 100 के निकटतम एकाधिक तक कैसे जा सकता हूं। (हम PAGE_SIZE-1
जोड़ते हैं, उसी कारण हमने S-1
ऊपर जोड़ा।)
आपकी वर्चुअल मेमोरी के साथ शुभकामनाएं!