একটি সংখ্যার নিকটতম ২-এর ঘাতক lignin (2ⁿ) বের করা।
উদাহরণ
365 → 256 (2⁸ = 256, 2⁹ = 512) 145 → 128 (2⁷ = 128, 2⁸ = 256)
সমাধান
const nearestPowerOfTwo = (num) => {
// নেগেটিভ হ্যান্ডলিং
num = Math.abs(num);
// ০ বা ১ এর জন্য
if (num <= 1) return 1;
// বিট অপারেশন ব্যবহার করে (সবচেয়ে দ্রুত)
// পরবর্তী ২-এর ঘাত বের করুন
let power = 1;
while (power < num) {
power <<= 1; // power *= 2
}
// পূর্ববর্তী ২-এর ঘাত
const prevPower = power >> 1; // power / 2
// কোনটি নিকটতম?
return (num - prevPower <= power - num) ? prevPower : power;
};
// আরও সংক্ষিপ্ত (বিট ট্রিক)
const nearestPowerOfTwoBit = (num) => {
num = Math.abs(num);
if (num <= 1) return 1;
// nächste 2^n বের করুন
const nextPow = 1 << (32 - Math.clz32(num - 1));
const prevPow = nextPow >> 1;
return (num - prevPow <= nextPow - num) ? prevPow : nextPow;
};
// টেস্ট
console.log(nearestPowerOfTwo(365)); // 256
console.log(nearestPowerOfTwo(145)); // 128
console.log(nearestPowerOfTwo(100)); // 128 (100-64=36, 128-100=28)
console.log(nearestPowerOfTwo(10)); // 8
বিট অপারেশন ব্যাখ্যা
x << n: x × 2ⁿ (বাম শিফট)x >> n: x ÷ 2ⁿ (ডান শিফট)Math.clz32(): লিডিং জিরোর সংখ্যা (৩২-বিট)
উৎপাদন
256