এই সমস্যায়, আমাদের একটি পূর্ণসংখ্যা X দেওয়া হয়েছে৷ আমাদের কাজ হল 0 থেকে X তে রূপান্তরিত করার জন্য নেওয়া পদক্ষেপগুলির মোট সংখ্যা খুঁজে বের করা৷
বৈধ রূপান্তর − একটি ধাপ গণনা করা হয় যখন একটি রূপান্তর A থেকে B তে সংঘটিত হয়। রূপান্তরটি সংঘটিত হওয়ার শর্ত হল A !=B এবং A &B =A (&বিটওয়াইজ AND)। সুতরাং, 1 ধাপ A থেকে B তে রূপান্তরিত হচ্ছে এবং আমাদের একটি প্রোগ্রাম তৈরি করতে হবে যা 0 থেকে X রূপান্তর করার জন্য সর্বাধিক সংখ্যক ধাপ গণনা করবে।
সমস্যাটি বোঝার জন্য একটি উদাহরণ দেওয়া যাক,
ইনপুট − X =7
আউটপুট − 3
ব্যাখ্যা −
আমাদের 0 থেকে 7 রূপান্তর করতে হবে।
Steps taken will be Step1: 0(00) to 1(01) , 0!= 1 and 0&1 = 0, transform 00=>01 Step2: 1(001) to 3(011) , 1!= 3 and 1&3 = 1, transform 001=>011 Step3: 3(0011) to 7(0111) , 3!= 7 and 3&7 = 3, tranform 0011=>0111.
এই সমস্যাটি সমাধান করার জন্য, আমরা X-এ সেট বিটের সংখ্যা গণনা করব যা 0 থেকে X থেকে সর্বাধিক রূপান্তর দেবে।
যেহেতু আমাদের সর্বাধিক রূপান্তর প্রয়োজন, আমাদের প্রতিটি সেট বিটের জন্য ধাপে ধাপে যেতে হবে (মান 1 সহ বিট)। বিট-এর পর বিট ট্রান্সফর্মেশন 0 থেকে X-এ রূপান্তরিত করার সর্বোচ্চ ধাপ দেবে।
A থেকে B তে রূপান্তরে, A এর সমস্ত সেট বিট B তে সেট করা উচিত, তবে বিপরীতটি প্রয়োজনীয় নয়। সুতরাং, ন্যূনতম রূপান্তর 1 হতে পারে কারণ 0-তে কোনও সেট বিট নেই যা ক্ষুদ্রতম রূপান্তরকে সরাসরি করে।
আমরা যে উদাহরণটি নিয়েছি তাতে দেখতে পাচ্ছি, সংখ্যার বাইনারি রূপান্তর এবং তাদের বিটওয়াইজ ANDs।
উদাহরণ
আমাদের সমাধানের বাস্তবায়ন দেখানোর জন্য প্রোগ্রাম -
//বিটওয়াইজ এবং C++ এ 0 থেকে X রূপান্তর করার জন্য সর্বাধিক ধাপগুলি খুঁজে বের করার প্রোগ্রাম
#include <bits/stdc++.h> using namespace std; int maxtransformation(int x){ int steps = 0; // counting number of bits while (x) { steps += x & 1; x >>= 1; } return steps; } int main(){ int x = 7; cout<<"The maximum number of steps to transform 0 to "<<x<<" with bitwise AND are "<<maxtransformation(x); return 0; }
আউটপুট
The maximum number of steps to transform 0 to 7 with bitwise AND are 3