কম্পিউটার টিউটোরিয়াল

C++-এ বিট চरম পজিশনে সোয়াপ করে অনসাইনড নম্বর সর্বাধিক করা

সমস্যা বিবরণ

একটি নম্বর দিয়ে সেটি তার চরম পজিশনের বিটগুলো সোয়াপ করে সর্বাধিক করুন অর্থাৎ প্রথম এবং শেষ পজিশন, দ্বিতীয় এবং দ্বিতীয় শেষ পজিশন এবং í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
  1. C++-এ একটি সংখ্যা তার অঙ্কগুলোর ফ্যাক্টোরিয়ালের যোগফল দিয়ে বিভাজ্য কিনা চেক করা

  2. C++-এ একটি মোবাইল নম্বর ফ্যান্সি (Fancy) কিনা চেক করা

  3. C++-এ একটি সংখ্যা প্রদত্ত বেসে আছে কিনা তা যাচাই করা

  4. C++-এ k সেট বিটস সহ একটি নম্বরকে ম্যাক্সিমাইজ করতে ন্যূনতম ফ্লিপ বের করা