দুটি সংখ্যা start এবং end দেওয়া আছে। রেঞ্জ [start, end]-এর সব নম্বরের বিটওয়াইজ AND বের করুন।
ইনপুট উদাহরণ
start = 8, end = 12
আউটপুট: 8 (বাইনারি: 1000 AND 1001 AND 1010 AND 1011 AND 1100 = 1000)
অ্যালগরিদম
n = end - start + 1(রেঞ্জের সাইজ)।- বিট ৩১ থেকে ০ পর্যন্ত চেক করুন: যদি
2^b < nহয়, তবে সেই বিট এবং নিচের বিটগুলোর AND = ০ হবে। - যদি
startএবংendউভয়েই বিট সেট থাকে, তবে রেজাল্টে সেট করুন।
পাইথন কোড
def solve(start, end):
n = end - start + 1
x = 0
for b in range(31, -1, -1):
if (1 << b) < n:
break
if (1 << b) & start & end:
x += 1 << b
return x
# টেস্ট
print(solve(8, 12)) # 8
ব্যাখ্যা
রেঞ্জের সাইজ n যদি 2^b-এর চেয়ে বড় হয়, তবে বিট b অবশ্যই ০ হবে (কারণ সাইকেল পুরো হয়ে যাবে)। শুধু কমন প্রিফিক্স বিটগুলো ১ থাকে।