কিছু দিন আগে, স্ট্যাক এক্সচেঞ্জের সদস্য এন্টো বিট- ওয়াইজ অপারেটরগুলির জন্য বৈধ ব্যবহার সম্পর্কে অনুসন্ধান করেছিলেন । আমি বলেছি যে স্থানান্তরটি দুটি সংখ্যার দ্বারা পূর্ণসংখ্যাগুলি গুণমান এবং ভাগ করার চেয়ে দ্রুত ছিল। স্ট্যাক এক্সচেঞ্জের সদস্য ডেইমিন বলেছিলেন যে ডান-শিফটিংয়ে নেতিবাচক সংখ্যাগুলির সাথে সমস্যাগুলি উপস্থাপিত হয়েছে।
এই মুহুর্তে, আমি স্বাক্ষরিত পূর্ণসংখ্যাগুলি সহ শিফট অপারেটরগুলি ব্যবহার করার বিষয়ে সত্যই ভাবিনি। আমি প্রাথমিকভাবে নিম্ন-স্তরের সফ্টওয়্যার বিকাশে এই কৌশলটি ব্যবহার করেছি; অতএব, আমি সর্বদা স্বাক্ষরবিহীন পূর্ণসংখ্যা ব্যবহার করি। সি স্বাক্ষরবিহীন পূর্ণসংখ্যার উপর যৌক্তিক শিফট সম্পাদন করে। লজিকাল শিফট ডানদিকে সম্পাদন করার সময় সাইন বিটের দিকে কোনও মনোযোগ দেওয়া হয় না। শূন্য বিটগুলি শূন্যে ভরা হয়। যাইহোক, সি একটি স্বাক্ষরিত পূর্ণসংখ্যা ডানদিকে সরানোর সময় একটি গাণিতিক শিফট অপারেশন সম্পাদন করে। শূন্য বিটগুলি সাইন বিট দ্বারা পূর্ণ হয়। এই পার্থক্যের ফলে একটি নেতিবাচক মান শূন্যের দিকে কাটা না গিয়ে অনন্তের দিকে গোলাকার হয়ে যায় যা স্বাক্ষরিত পূর্ণসংখ্যা বিভাগের চেয়ে আলাদা আচরণ behavior
কয়েক মিনিটের চিন্তার ফলস্বরূপ একটি প্রথম-অর্ডার সমাধান হয়েছে। সমাধানটি শর্তাধীন স্থানান্তরিত হওয়ার আগে নেতিবাচক মানগুলিকে ইতিবাচক মানগুলিতে রূপান্তর করে। একটি মান শর্তসাপেক্ষে শিফট অপারেশন সম্পাদন হওয়ার পরে তার নেতিবাচক আকারে ফিরে আসে।
int a = -5;
int n = 1;
int negative = q < 0;
a = negative ? -a : a;
a >>= n;
a = negative ? -a : a;
এই সমাধানটির সমস্যাটি হ'ল শর্তসাপেক্ষ অ্যাসাইনমেন্টের বিবৃতিগুলি সাধারণত কমপক্ষে একটি লাফের নির্দেশিকায় অনুবাদ করা হয় এবং প্রসেসরের ক্ষেত্রে লাফের নির্দেশিকা ব্যয়বহুল হতে পারে যা উভয় নির্দেশের পাথকেই ডিকোড করে না। একটি নির্দেশিকা পাইপলাইন দু'বার পুনরায় প্রাইম করার পরে বিভাজনকে স্থানান্তরিত করে যে কোনও পারফরম্যান্স লাভ পাওয়া যায়।
উপরের কথাটি বলে শনিবার শর্তসাপেক্ষ অ্যাসাইনমেন্ট সমস্যার উত্তর দিয়ে আমি জেগেছি। পাটিগণিত শিফট অপারেশন সম্পাদন করার সময় আমরা যে বৃত্তাকার সমস্যাটি অনুভব করি কেবল তখন দুজনের পরিপূরক উপস্থাপনার সাথে কাজ করার সময় ঘটে। এটি কারও পরিপূরক প্রতিনিধিত্ব করে না। সমস্যার সমাধানটিতে দু'জনের পরিপূরক মানটিকে শিফট অপারেশন করার আগে একজনের পরিপূরক মানকে রূপান্তর করা জড়িত। তারপরে আমাদের কারও পরিপূরক মানটিকে দু'জনের পরিপূরক মানকে রূপান্তর করতে হয়। আশ্চর্যজনকভাবে, আমরা শিফট অপারেশন করার আগে শর্তাধীন নেতিবাচক মানগুলিকে রূপান্তর না করেই এই সেট অপারেশনগুলি সম্পাদন করতে পারি।
int a = -5;
int n = 1;
register int sign = (a >> INT_SIZE_MINUS_1) & 1
a = (a - sign) >> n + sign;
একটি দুটি এর পরিপূরক নেতিবাচক মান একটি বিয়োগ করে একটি এর পরিপূরক নেতিবাচক মান রূপান্তরিত হয়। ফ্লিপ দিকে, একজনের পরিপূরক নেতিবাচক মানকে একটি যোগ করে দুটির পরিপূরক নেতিবাচক মানকে রূপান্তর করা হয়। উপরে তালিকাভুক্ত কোডটি কাজ করে কারণ দু'জনের পরিপূরক থেকে অন্যটির পরিপূরক এবং তদ্বিপরীত রূপান্তর করতে সাইন বিট ব্যবহার করা হয় । কেবল নেতিবাচক মানগুলিতে তাদের সাইন বিট সেট থাকবে; সুতরাং, ভেরিয়েবল সাইনটি শূন্যের সমান হবে যখন কোনও ধনাত্মক হয়।
উপরের কথাটি বলে আপনি কি উপরের মতো অন্যান্য বিট-ওয়াইজ হ্যাকগুলি ভাবতে পারেন যা এটি আপনার কৌশলগুলির ব্যাগের মধ্যে ফেলেছে? আপনার প্রিয় বিট বুদ্ধিমান হ্যাক কি? আমি সর্বদা নতুন পারফরম্যান্স-ভিত্তিক বিট-ওয়াইজ হ্যাকের সন্ধান করছি।