আপনি যদি এই পদ্ধতিগুলিকে অনেক কল করেন তবে দ্রুততম উপায়টি বিট ম্যানিপুলেশন নয় তবে সম্ভবত একটি সন্ধানের টেবিল। প্রতিটি ক্রিয়াকলাপের জন্য 511 দৈর্ঘ্যের অ্যারের সংজ্ঞা দিন। বিয়োগের জন্য উদাহরণ (বিয়োগ)
static unsigned char maxTable[511];
memset(maxTable, 0, 255);
maxTable[255]=0;
for (int i=0; i<256; i++)
maxTable[255+i] = i;
অ্যারে স্থির এবং একবারে আরম্ভ করা হয়। এখন আপনার বিয়োগটি ইনলাইন পদ্ধতি বা প্রাক-সংকলক ব্যবহার করে সংজ্ঞায়িত করা যেতে পারে:
#define MINUS(A,B) maxTable[A-B+255];
কিভাবে এটা কাজ করে? ভাল আপনি স্বাক্ষরযুক্ত অক্ষরের জন্য সমস্ত সম্ভাব্য বিয়োগগুলি প্রাক-গণনা করতে চান। ফলাফলগুলি -255 থেকে 255-এ পরিবর্তিত হয়, মোট 511 টি ভিন্ন ফলাফল। আমরা সম্ভাব্য সকল ফলাফলের একটি অ্যারে সংজ্ঞায়িত করি তবে সিতে আমরা এটি ব্যবহার করে এমন নেতিবাচক সূচকগুলি থেকে অ্যাক্সেস করতে পারি না ([A-B + 255])। আপনি অ্যারের কেন্দ্রে একটি পয়েন্টার সংজ্ঞায়িত করে এই ক্রিয়াটি সরাতে পারেন।
const unsigned char *result = maxTable+255;
#define MINUS(A,B) result[A-B];
এটি ব্যবহার করুন:
bsub = MINUS(13,15)
উল্লেখ্য, কার্যকর করা অত্যন্ত দ্রুত। ফলাফল পেতে কেবলমাত্র একটি বিয়োগফল এবং একটি পয়েন্টারের সম্মান। কোন শাখা নেই। স্ট্যাটিক অ্যারেগুলি খুব ছোট তাই তারা গণনার আরও গতি বাড়ানোর জন্য সিপিইউ'র ক্যাশে পুরোপুরি লোড হবে will
একই সংযোজনের জন্য কাজ করবে তবে কিছুটা আলাদা টেবিলের সাথে (প্রথম 256 উপাদান সূচকগুলি হবে এবং শেষ 255 উপাদানগুলি 255 এর বাইরে কাট অফকে অনুকরণ করতে 255 এর সমান হবে)।
আপনি যদি বিট ক্রিয়াকলাপের জন্য জেদ করেন তবে যে উত্তরগুলি ব্যবহার করে (এ> বি) ভুল are এটি এখনও শাখা হিসাবে প্রয়োগ করা যেতে পারে। সাইন-বিট কৌশলটি ব্যবহার করুন
#define is_int_biggerNotEqual( num1,num2) ((((__int32)((num2)-(num1)))&0x80000000)>>31)
এখন আপনি এটি বিয়োগ এবং সংযোজনের গণনার জন্য ব্যবহার করতে পারেন।
আপনি যদি শাখা ব্যবহার ছাড়াই সর্বোচ্চ (), মিনিট () ফাংশনগুলি অনুকরণ করতে চান:
inline __int32 MIN_INT(__int32 x, __int32 y){ __int32 d=x-y; return y+(d&(d>>31)); }
inline __int32 MAX_INT(__int32 x, __int32 y){ __int32 d=x-y; return x-(d&(d>>31)); }
আমার উপরের উদাহরণগুলি 32 বিট পূর্ণসংখ্যার ব্যবহার করে। আপনি এটি 64 এ পরিবর্তন করতে পারেন, যদিও আমি বিশ্বাস করি 32 বিট গণনা কিছুটা দ্রুত চলে run আপনার উপর
y ^ ((x ^ y) & -(x < y))
int
প্রকারের জন্যmin(x, y)
শাখা ছাড়াই মূল্যায়ন । এটি এখন অবধি যা আছে তার ভিত্তিতে এটি একটি চূড়ান্ত সমাধানের অংশ তৈরি করতে পারে।