यदि आप उन तरीकों को बहुत अधिक कहेंगे, तो सबसे तेज़ तरीका थोड़ा हेरफेर नहीं होगा, लेकिन शायद एक लुक-अप टेबल होगा। प्रत्येक ऑपरेशन के लिए लंबाई 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];
यह काम किस प्रकार करता है? वैसे आप अहस्ताक्षरित वर्णों के लिए सभी संभावित घटावों की पूर्व-गणना करना चाहते हैं। परिणाम -५५ से ५:५५ तक अलग-अलग हैं, कुल ५११ अलग-अलग परिणाम हैं। हम सभी संभावित परिणामों की एक सरणी को परिभाषित करते हैं, लेकिन क्योंकि C में हम इसे नकारात्मक सूचकांकों से एक्सेस नहीं कर सकते हैं जिनका हम +255 ([ए-बी + 255] में उपयोग करते हैं)। आप सरणी के केंद्र में एक पॉइंटर को परिभाषित करके इस क्रिया को हटा सकते हैं।
const unsigned char *result = maxTable+255;
#define MINUS(A,B) result[A-B];
इसका उपयोग करें जैसे:
bsub = MINUS(13,15)
ध्यान दें कि निष्पादन बहुत तेज है। परिणाम प्राप्त करने के लिए केवल एक घटाव और एक सूचक deference। कोई शाखा नहीं। स्थिर सरणियाँ बहुत कम हैं, इसलिए गणना की गति को और तेज करने के लिए उन्हें पूरी तरह से सीपीयू के कैश में लोड किया जाएगा
सेम इसके अलावा के लिए काम करेगा, लेकिन एक अलग तालिका के साथ (पहले 256 तत्व सूचक होंगे और अंतिम 255 तत्व 255 से परे कटऑफ का अनुकरण करने के लिए 255 के बराबर होंगे।
यदि आप बिट्स ऑपरेशन पर जोर देते हैं, तो उपयोग किए जाने वाले उत्तर (a> b) गलत हैं। यह अभी भी शाखाओं के रूप में लागू किया जा सकता है। साइन-बिट तकनीक का उपयोग करें
#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 बिट की गणना थोड़ी तेज चलती है। आप पर निर्भर करता है
y ^ ((x ^ y) & -(x < y))
के लिएint
प्रकार का मूल्यांकन करता हैmin(x, y)
शाखाओं के बिना। यह आपके लिए अब तक के आधार पर एक अंतिम समाधान का हिस्सा बन सकता है।