এই সমস্যাতে, আমাদের দুটি পূর্ণসংখ্যা a এবং b দেওয়া আছে। এবং আমাদের কাজ হলো a থেকে b পর্যন্ত রেঞ্জের বিটওয়াইজ AND (&) বের করা। অর্থাৎ a & a+1 & a+2 & … b-1 & b-এর মান বের করতে হবে।
উদাহরণ দিয়ে বুঝি,
ইনপুট − a = 3 , b = 8
আউটপুট − 0
ব্যাখ্যা − 3 & 4 & 5 & 6 & 7 & 8 = 0
সমস্যা সমাধানের জন্য, একটি সহজ সমাধান হচ্ছে a থেকে শুরু করে b পর্যন্ত এক এক করে বাড়িয়ে বিটওয়াইজ AND করা।
আরো দক্ষ সমাধান,
এটি একটি আরও দক্ষ সমাধান, যা নিচের ধাপগুলো দিয়ে করা যায় −
স্টেপ ১ − b-এর LSB ফ্লিপ করুন।
স্টেপ ২ − নম্বরটি a এবং b-এর সাথে তুলনা করুন, চেক করুন এটি রেঞ্জে আছে কিনা,
স্টেপ ২.১ − যদি নম্বরটি a-র চেয়ে বড় হয়, এর LSB আবার ফ্লিপ করুন।
স্টেপ ২.২ − যদি না হয় তবে নম্বরটি = রেজাল্ট।
এখন, দেখি উপরের অ্যালগরিদমটি কাজ করছে কিনা −
উদাহরণ − a = 3 এবং b = 8।
সমাধান −
স্টেপ ১ − b = 8 (1000), LSB ফ্লিপ করলে যা একমাত্র ১ আছে সেটি। নম্বরটি হয়ে যায় 0000 অর্থাৎ 0।
স্টেপ ২ − 0, 3-র চেয়ে কম, তাই 0 হচ্ছে রেজাল্ট।
উদাহরণ
এখন, সমস্যা সমাধানের কোড,
#include <stdio.h>
int main(){
long a, b;
a = 3; b = 8;
do{
b -= (b & -b);
}while(a < b);
printf("%li", b);
}আউটপুট
0