HeadlinesBriefing HeadlinesBriefing.com

C++ বিটমাস্ক অপারেশন এবং ইনটিগ্রাল প্রমোশন

Hacker News •
×

আমি সম্প্রতি P4313 R1 পরীক্ষা করেছি, যা C++26 অ্যানোটেশনের মাধ্যমে enum গুলির জন্য বিটমাস্ক অপারেশন যোগ করেছে একটি স্ট্যান্ডার্ড প্রস্তাব। কেন্দ্রীয় ধারণা হলো `[[=std::bitmask_type]]` ব্যবহার করে বিট অপারেটরগুলো স্বয়ংক্রিয়ভাবে জেনারেট করা, যা ম্যানুয়াল ইমপ্লিমেন্টেশনকে দূর করে। যাইহোক, C++ কম্পাইলারগুলো ইনটিগ্রাল টাইপের উপর বিট অপারেশনগুলো সহজেই গণনা করতে পারে, একটি গুরুত্বপূর্ণ বিষয় হলো ইনটিগ্রাল প্রমোশন। `int` এর চেয়ে ছোট টাইপ, যেমন `short`, অপারেশনটি ঘটার আগে `int` এ প্রমোট হয়। এর অর্থ হলো যে ছোট টাইপগুলোর উপর অপারেশনের ফলাফলের টাইপ ডিফল্টভাবে `int` হয়, যাতে অপ্রত্যাশিত আচরণ এড়াতে মূল টাইপে ফিরে `static_cast` প্রয়োজন হয়। উপরন্তু, `bool` একটি অনন্য ঝুঁকি তৈরি করে। বুলিয়ন কনভার্সন বিট প্যাটার্নকে ট্রানকাট করে না; বরং এটি কোনো অন-জিরো মানকে `true` (পূর্ণাঙ্গ মান 1) এবং শূন্যকে `false` এ ম্যাপ করে। এই নিযমগুলো একত্র করলে একটি অদ্ভুত ঘটনা প্রকাশ পায়: `true` এর কমপ্লিমেন্ট (`~true`) `true` কে `int` (মান 1) এ প্রমোট করে, টু কমপ্লিমেন্টের ফলাফল `-2` হিসাবে গণনা করে, এবং `-2` অন-জিরো হওয়ায়, বুলিয়ন কনভার্সন `true` ফেরত দেয়। সুতরাং, `static_cast(~true) == true`. এই আচরণ `bool` ভিত্তিক enum গুলোতে প্রসারিত হয়, যেমন `[[=std::bitmask_type]]` দিয়ে সংজ্ঞিত হওয়াগুলো, যা এই অন্তর্নিহিত রূপান্তরগুলো বোঝার গুরুত্বকে জারি করে যাতে C++ ডেভেলপমেন্ট রক্ষিত হয়।

উৎস: Hacker News · সারাংশ: HeadlinesBriefing