पूर्णांकों
आम तौर पर हम डबल्स का उपयोग नहीं करना चाहते हैं क्योंकि हम फ्लोटिंग पॉइंट ऑप्स, राउंडिंग एरर आदि का उपयोग नहीं करना चाहते हैं। वे अभी जरूरी नहीं हैं।
इसके लिए यह याद रखना एक अच्छा विचार है कि छत के विभाजन को कैसे किया जाए: ceil(x / y)
डबल्स में लिखा जा सकता है (x + y - 1) / y
(नकारात्मक संख्या से बचने के दौरान, लेकिन अतिप्रवाह से सावधान रहें)।
पठनीय
यदि आप पठनीयता के लिए जाते हैं, तो आप निश्चित रूप से इसे भी इस तरह से प्रोग्राम कर सकते हैं (उदाहरण के लिए जावा में, सी के लिए आप मैक्रो का उपयोग कर सकते हैं, बेशक):
public static int ceilDiv(int x, int y) {
return (x + y - 1) / y;
}
public static int paddedBase64(int n) {
int blocks = ceilDiv(n, 3);
return blocks * 4;
}
public static int unpaddedBase64(int n) {
int bits = 8 * n;
return ceilDiv(bits, 6);
}
// test only
public static void main(String[] args) {
for (int n = 0; n < 21; n++) {
System.out.println("Base 64 padded: " + paddedBase64(n));
System.out.println("Base 64 unpadded: " + unpaddedBase64(n));
}
}
inlined
गुदगुदा
हम जानते हैं कि हमें प्रत्येक 3 बाइट्स (या कम) के लिए 4 वर्ण ब्लॉक की आवश्यकता है। तो फिर सूत्र बन जाता है (x = n और y = 3 के लिए):
blocks = (bytes + 3 - 1) / 3
chars = blocks * 4
या संयुक्त:
chars = ((bytes + 3 - 1) / 3) * 4
आपका कंपाइलर ऑप्टिमाइज़ करेगा 3 - 1
, इसलिए पठनीयता बनाए रखने के लिए इसे ऐसे ही छोड़ दें।
unpadded
कम आम अनपेड वैरिएंट है, इसके लिए हमें याद है कि प्रत्येक को हमें प्रत्येक 6 बिट्स के लिए एक चरित्र की आवश्यकता होती है, गोल:
bits = bytes * 8
chars = (bits + 6 - 1) / 6
या संयुक्त:
chars = (bytes * 8 + 6 - 1) / 6
हम अभी भी दो से विभाजित कर सकते हैं (यदि हम चाहते हैं):
chars = (bytes * 4 + 3 - 1) / 3
अस्पष्ट
यदि आप अपने कंपाइलर पर भरोसा नहीं करते हैं तो आपके लिए अंतिम अनुकूलन (या यदि आप अपने सहयोगियों को भ्रमित करना चाहते हैं):
गुदगुदा
((n + 2) / 3) << 2
unpadded
((n << 2) | 2) / 3
इसलिए, हम गणना के दो तार्किक तरीके हैं, और हमें किसी भी शाखा, बिट-ऑप्स या मोडुलो ऑप्स की आवश्यकता नहीं है - जब तक कि हम वास्तव में नहीं चाहते हैं।
टिप्पणियाँ:
- जाहिर है आपको एक शून्य समाप्ति बाइट को शामिल करने के लिए गणना में 1 जोड़ने की आवश्यकता हो सकती है।
- माइम के लिए आपको संभावित लाइन समाप्ति पात्रों और इस तरह की देखभाल करने की आवश्यकता हो सकती है (इसके लिए अन्य उत्तरों की तलाश करें)।