पर निरंतर शाखाओं में रूपांतरण यदि मैं निम्नलिखित कोड के अंतिम दो "if" कथन को एक शाखा रहित राज्य में परिवर्तित करने का तरीका जानने के लिए अटक गया हूं।बयान
int u, x, y;
x = rand() % 100 - 50;
y = rand() % 100 - 50;
u = rand() % 4;
if (y > x) u = 5;
if (-y > x) u = 4;
या, के मामले में ऊपर निकला भी मुश्किल हो सकता है, आप उन पर विचार कर के रूप में:
if (x > 0) u = 5;
if (y > 0) u = 4;
मुझे लगता है कि मुझे क्या हो जाता है तथ्य यह है कि उन लोगों के लिए एक else
नहीं है पकड़ने वाला। अगर ऐसा होता तो मैं संभवतः एक शाखा रहित abs
(या max
/min
) फ़ंक्शन का एक भिन्नता अनुकूलित कर सकता था।
rand()
फ़ंक्शन जो आप देखते हैं वे वास्तविक कोड का हिस्सा नहीं हैं। मैंने उन्हें अपेक्षित श्रेणियों पर संकेत देने के लिए जोड़ा है कि वेरिएबल्स x
, y
और u
संभवतः दो शाखाएं होने पर संभवतः हो सकती हैं।
उद्देश्य के लिए असेंबली मशीन कोड की अनुमति है।
संपादित करें:
बाद braingrinding का एक सा मैं एक साथ काम कर रहे एक शाखा संस्करण डाल करने में कामयाब रहे:
int u, x, y;
x = rand() % 100 - 50;
y = rand() % 100 - 50;
u = rand() % 4;
u += (4-u)*((unsigned int)(x+y) >> 31);
u += (5-u)*((unsigned int)(x-y) >> 31);
दुर्भाग्य पूर्णांक शामिल गणित के कारण, अगर बयान के साथ मूल संस्करण में पता चला है 30% रेंज से तेज हो।
कंपाइलर जानता है कि पार्टी कहां है।
क्या एक्स और वाई कहीं और उपयोग किया जाता है? यदि नहीं, तो उन पंक्तियों में से प्रत्येक भी 'अगर (रैंड()% 2) हो सकता है ... '। –
'u + = (5 - u) * (y> x);'? –
@ ओलिवर चार्ल्सवर्थ मैं देखता हूं। हां, वे कहीं और इस्तेमाल होते हैं। – user2464424