সমস্যা বিবরণ
একটি অনসাইনড নম্বর দেওয়া আছে, দেওয়া অনসাইনড নম্বরের বিটগুলো ব্যবহার করে সর্বোচ্চ সংখ্যা কত হতে পারে তা বের করুন।
যদি ইনপুট নম্বর হয় 8 তবে এর বাইনারি রিপ্রেজেন্টেশন হল:
00000000000000000000000000001000
সর্বোচ্চ করার জন্য MSB-কে ১ সেট করুন। তবে নম্বর হয় 2147483648 যেটার বাইনারি রিপ্রেজেন্টেশন হল:
10000000000000000000000000000000
অ্যালগরিদম
1. দেওয়া নম্বরের বাইনারি রিপ্রেজেন্টেশনে সেট বিটের সংখ্যা গণনা করুন। 2. n সংখ্যক লিস্ট সিগনিফিক্যান্ট সেট বিট বিশিষ্ট একটি নম্বর খুঁজে বের করুন। 3. নম্বরটি (32 - n) বিয়ে লেফট শিফট করুন।
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
unsigned getMaxNumber(unsigned num) {
int n = __builtin_popcount(num);
if (n == 32) {
return num;
}
unsigned result = (1 << n) - 1;
return (result << (32 - n));
}
int main() {
unsigned n = 8;
cout << "Maximum number = " << getMaxNumber(n) << endl;
return 0;
}
আউটপুট
Maximum number = 2147483648