2010-11-25 7 views
15

twiddling:C/C++ बिट <a href="http://graphics.stanford.edu/~seander/bithacks.html" rel="nofollow">graphics.stanford.edu/~seander/bithacks.html</a> की भावना मैं निम्नलिखित समस्या को हल करने की जरूरत है

int x; 
int pow2; // always a positive power of 2 
int sgn; // always either 0 or 1 
// ... 
// ... 
if(sgn == 0) 
    x -= pow2; 
else 
    x += pow2; 
बेशक

मैं सशर्त बचने की जरूरत है। अब तक का सबसे अच्छा मैं

x -= (1|(~sgn+1))*pow2 

परन्तु इसमें एक गुणा शामिल है जिसे मैं टालना चाहूंगा। अग्रिम में धन्यवाद।

संपादित करें: धन्यवाद सब,

x -= (pow2^-sgn) + sgn 

चाल करने के लिए लगता है!

+0

आप तो जवाब को स्वीकार करना चाहिए। – Simone

+0

जब गुणा कोई समस्या नहीं है, तो हमारे पास यह भी है: 'x - = (1-2 * sgn) * पाउ', मैपिंग '0 -> 1' और' 1 -> -1' का उपयोग करके, जो 'x - > (1-2x) '। – rafak

+0

एक बार फिर, कोष्ठक! '^' की प्राथमिकता '+' से कम है, इसलिए 'x - = pow2^-sgn + sgn'' x - = pow2^(- sgn + sgn) '' x - = pow2' है। – lijie

उत्तर

16

मैं

x -= (pow2^(~sgn+1)) + sgn 

के रूप में टिप्पणी में Lijie ने सुझाव दिया की कोशिश करेगा या,

x -= (pow2^-sgn) + sgn 

यदि sgn 012 है, ~sgn+1 भी 0 है, इसलिए pow2^(~sgn+1) == pow2। यदि sgn1 है, (~sgn+1)0xFFFFFFFF है, और (pow2^(~sgn+1)) + sgn == -pow2 है।

+4

आप '~ sgn + 1' को '-sgn' में बदल सकते हैं। – lijie

+0

@ लिजी: हाँ, ठीक है। धन्यवाद! –

+2

ओह हाँ। ओह '^' '' 'की तुलना में कम प्राथमिकता है, इसलिए मैं ब्रांड्स का सुझाव देता हूं। – lijie

2
मेरे सिर के ऊपर बंद

:

int subMask = sgn - 1; 
x -= pow2 & subMask; 
int addMask = -sgn; 
x += pow2 & addMask; 

चाहे वह काम करता है या कि क्या यह स्मार्ट है, यह सिर्फ एक यादृच्छिक विचार है कि मेरे सिर में पॉप है पर कोई गारंटी।

संपादित करें: यदि यह कुछ कम पठनीय (उर्फ अधिक कॉम्पैक्ट) चलो करते हैं:

x += (pow2 & -sgn) - (pow2 & (sgn-1)); 
4
mask = sgn - 1; // generate mask: sgn == 0 => mask = -1, sgn == 1 => mask = 0 

x = x + (mask & (-pow2)) + (~mask & (pow2)); // use mask to select +/- pow2 for addition 
+0

यह एक सशर्त है। –

+4

@ सेवन: नहीं, 'और' थोड़ा सा ऑपरेटर –

+0

है जब मैंने अपनी टिप्पणी पोस्ट की थी तो एक सशर्त था। और आप यह जानते हैं। –

1

मैं इंटरफ़ेस बदल दूंगा और बाएं शिफ्ट द्वारा गुणा को प्रतिस्थापित कर दूंगा। (Pow2 के बजाय प्रतिपादक प्रयोग)

1

आप की तरह कुछ (लिंक से) कर सकते हैं x + = ((pow2^-sgn) + sgn)