সমস্যা বিবরণ
একটি ডেসিমেল নম্বর দেওয়া আছে। এর বাইনারি রিপ্রেজেন্টেশনের কমপ্লিমেন্ট (বিট ফ্লিপ) নিয়ে আবার ডেসিমেলে কনভার্ট করে ফেরত দিতে হবে।
উদাহরণ: 20 → বাইনারি: 10100 → কমপ্লিমেন্ট: 01011 → ডেসিমেল: ১১।
সমাধানের পদ্ধতি
- নম্বরটিকে বাইনারি স্ট্রিং-এ কনভার্ট করুন (bin())।
- '0b' প্রিফিক্স বাদ দিয়ে বিটগুলো উল্টা দিয়ে পড়ুন।
- '0' হলে পরবর্তি বিট পজিশনের ভ্যালু (2^position) যোগ করুন।
- 'b' পাওয়া পর্যন্ত চলুন।
পাইথন উদাহরণ
class Solution(object):
def bitwiseComplement(self, N):
if N == 0:
return 1
s = bin(N)[2:] # '0b' বাদ
ans = 0
power = 1
for ch in reversed(s):
if ch == '0':
ans += power
power <<= 1
return ans
ob1 = Solution()
print(ob1.bitwiseComplement(20))
ইনপুট
20
আউটপুট
11
বিট ম্যানিপুলেশন পদ্ধতি (O(1) স্পেস, দ্রুত)
def bitwiseComplement(N):
if N == 0:
return 1
# সবচোয়ে নিকটের ২-এর ঘাত বের করুন (MSB পজিশন)
mask = 1
while mask <= N:
mask <<= 1
# mask - 1 দিয়ে XOR করলে বিট ফ্লিপ হয়
return (mask - 1) ^ N
# বা আরও সহজ:
def bitwiseComplement(N):
if N == 0: return 1
bits = N.bit_length()
return (1 << bits) - 1 - N