পূর্ণসংখ্যার
সাধারণত আমরা ডাবল ব্যবহার করতে চাই না কারণ আমরা ভাসমান বিন্দু অপস, রাউন্ডিং ত্রুটি ইত্যাদি ব্যবহার করতে চাই না সেগুলি কেবল প্রয়োজনীয় নয়।
এর জন্য সিলিং বিভাগটি কীভাবে সম্পাদন করতে হবে তা মনে রাখা ভাল: 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
padded
আমরা জানি যে আমাদের প্রতি 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
অপাঠ্য
যদি আপনি আপনার সংকলককে আপনার জন্য চূড়ান্ত অপ্টিমাইজেশানগুলি করতে বিশ্বাস করেন না (বা আপনি যদি আপনার সহকর্মীদের বিভ্রান্ত করতে চান):
padded
((n + 2) / 3) << 2
Unpadded
((n << 2) | 2) / 3
সুতরাং আমরা গণনার দুটি লজিক্যাল উপায়, এবং আমাদের কোনও শাখা, বিট-অপস বা মডুলো অপের প্রয়োজন নেই - যদি না আমরা সত্যিই না চাই।
মন্তব্য:
- স্পষ্টতই আপনাকে নাল টার্মিনেশন বাইট অন্তর্ভুক্ত করতে গণনাগুলিতে 1 যুক্ত করতে হতে পারে।
- মাইমের জন্য আপনার সম্ভাব্য লাইন সমাপ্তি অক্ষর এবং এই জাতীয় যত্ন নিতে হবে (এর জন্য অন্যান্য উত্তরগুলি সন্ধান করুন)।