2010-09-29 10 views
6

मैं इस सी अभिव्यक्ति को J में कैसे लिखूं? (जहां x इनपुट पूर्णांक है, और a अस्थायी चर रहा है)मैं जे में इस सी अभिव्यक्ति को कैसे लिखूं?

((a= ~x & (~x >> 1)) ^= a ? 0 : (a^(a & (a - 1))) | (a^(a & (a - 1))) << 1); 

संपादित करें:

एक और अधिक पठनीय रूप में:

int a = (~x) & ((~x) >> 1); 
    if (a == 0) return 0; 
    int b = a^(a & (a - 1)); 
    return b | (b << 1); 
+11

हम पहली बार इसे लिखने वाले बेस्टर्ड को कैसे पाते हैं? – GManNickG

+0

यह होमवर्क नहीं है, लेकिन यह 1 चुनौती थी। इसे हल करने के बाद मैंने अभी सोचा, कि मैंने लंबे समय से जे के साथ नहीं खेला है, और इसके वाक्यविन्यास को भूल गया है। यहां कुछ सोचा था। – Margus

+3

यह अभिव्यक्ति अपरिभाषित व्यवहार में परिणाम देती है। उप-संपीड़न '((ए = ~ एक्स और (~ x >> 1))^= ए 'दो' अपूर्ण संशोधनों को 'ए' में बनाता है।" अधिक पठनीय रूप "का परिणाम अपरिभाषित व्यवहार में नहीं होता है, इसलिए यह वही नहीं है चीज। –

उत्तर

5

परीक्षण के बिना, बुनियादी प्रतिलेखन कुछ इस तरह होगा:

Shift =: (33 b.) 
And =: (17 b.) 
Not =: (26 b.) 
Xor =: (22 b.) 
Or =: (23 b.) 

BastardFunction =: 3 : 0 
    a =. (Not y) And (_1 Shift (Not y)) 
    if. a do. 
    b =. a Xor (a And a - 1) 
    (1 Shift b) Or b 
    else. 
    0 
    end. 
) 

लेकिन वहाँ एक समझदारी भरा दृष्टिकोण हो सकता है।

+0

हमम, मुझे अक्सर 0 नहीं मिलता है ... ऐसा कहना है, कभी नहीं। – MPelletier

+0

मूल्य 0-9 के लिए मान्य मुझे सरलीकृत रूप के समान परिणाम मिलते हैं। – MPelletier

+0

(2^31) -3, (2^31) -2, और (2^31) -1 सभी वापस आ जाएंगे 0. – MPelletier

3

यहाँ ("पठनीय रूप" संस्करण की) एक छोटे से analyzis है:

usnigned int nx = ~x; // I suppose it's unsigned 
int a = nx & (nx >> 1); 
// a will be 0 if there are no 2 consecutive "1" bits. 
// or it will contain "1" in position N1 if nx had "1" in positions N1 and N1 + 1 
if (a == 0) return 0; // we don't have set bits for the following algorithm 
int b = a^(a & (a - 1)); 
// a - 1 : will reset the least 1 bit and will set all zero bits (say, NZ) that were on smaller positions 
// a & (a - 1) : will leave zeroes in all (NZ + 1) LSB bits (because they're only bits that has changed 
// a^(a & (a - 1)) : will cancel the high part, leaving only the smallest bit that was set in a 
// so, for a = 0b0100100 we'll obtain a power of two: b = 0000100 
return b | (b << 1);  
// knowing that b is a power of 2, the result is b + b*2 => b*3 

ऐसा लगता है कि एल्गोरिथ्म x परिवर्तनीय में पहले 2 (एलएसबी से शुरू) लगातार 0 बिट्स की तलाश में है। यदि कोई नहीं है, तो परिणाम 0. यदि वे पाए जाते हैं, तो स्थिति PZ पर कहें, तो परिणाम में दो सेट बिट्स होंगे: PZ और PZ+1

संबंधित मुद्दे