সমস্যা বিবরণ
একটি নম্বর দিয়ে সেটি তার চরম পজিশনের বিটগুলো সোয়াপ করে সর্বাধিক করুন অর্থাৎ প্রথম এবং শেষ পজিশন, দ্বিতীয় এবং দ্বিতীয় শেষ পজিশন এবং így дале।
যদি ইনপুট নম্বর হয় 8 তবে এর বাইনারি রিপ্রেজেন্টেশন হল:
00000000 00000000 00000000 00001000
চরম পজিশনের বিট সোয়াপ করার পর নম্বর হয়:
00010000 00000000 00000000 00000000 এবং এর ডেসিমেল সমতুল্য: 268435456
অ্যালগরিদম
1. মূল নম্বরের একটি কপি তৈরি করুন। 2. কম সিগনিফিক্যান্ট বিট ১ এবং বেশি সিগনিফিক্যান্ট বিট ০ হলে শুধু বিটগুলো সোয়াপ করুন, প্রক্রিয়া চালিয়ে যান যতক্ষণ কম সিগনিফিক্যান্ট বিটের পজিশন বেশি সিগনিফিক্যান্ট বিটের পজিশন থেকে ছোট। 3. নতুন নম্বর রিটার্ন করুন।
উদাহরণ
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
ull getMaxNumber(ull num) {
ull origNum = num;
int bitCnt = sizeof(ull) * 8 - 1;
int cnt = 0;
for (cnt = 0; cnt < bitCnt; ++cnt, --bitCnt) {
int m = (origNum >> cnt) & 1;
int n = (origNum >> bitCnt) & 1;
if (m > n) {
int x = (1 << cnt | 1 << bitCnt);
num = num ^ x;
}
}
return num;
}
int main() {
ull num = 8;
cout << "Maximum number = " << getMaxNumber(num) << endl;
return 0;
}
আউটপুট
Maximum number = 268435456