2010-03-25 10 views
5

का उपयोग कर बिट रिवर्सल मैं बाइट में थोड़ा उलटा करने की कोशिश कर रहा हूं। मैं नीचेबिटवार्स

static int BitReversal(int n) 
{ 
    int u0 = 0x55555555; // 01010101010101010101010101010101 
    int u1 = 0x33333333; // 00110011001100110011001100110011 
    int u2 = 0x0F0F0F0F; // 00001111000011110000111100001111 
    int u3 = 0x00FF00FF; // 00000000111111110000000011111111 
    int u4 = 0x0000FFFF; 
    int x, y, z; 
    x = n; 
    y = (x >> 1) & u0; 
    z = (x & u0) << 1; 
    x = y | z; 

    y = (x >> 2) & u1; 
    z = (x & u1) << 2; 
    x = y | z; 

    y = (x >> 4) & u2; 
    z = (x & u2) << 4; 
    x = y | z; 

    y = (x >> 8) & u3; 
    z = (x & u3) << 8; 
    x = y | z; 

    y = (x >> 16) & u4; 
    z = (x & u4) << 16; 
    x = y | z; 

    return x; 
} 

कोड का उपयोग यह बिट (32-बिट मशीन पर) Reverser सकते हैं, लेकिन वहाँ एक समस्या, उदाहरण के लिए, इनपुट १०००१११११०१ है, मैं +१०१११११०००१ प्राप्त करना चाहते हैं, लेकिन इस विधि है शीर्षक 0s सहित पूरे बाइट को उलट देगा। आउटपुट 10111110001000000000000000000000 है। क्या वास्तविक संख्या को रिवर्स करने के लिए कोई तरीका है? मैं इसे स्ट्रिंग और रिवर्सर में कनवर्ट नहीं करना चाहता, फिर फिर से कनवर्ट करना चाहता हूं। क्या कोई शुद्ध गणित विधि या बिट ऑपरेशन विधि है?

शुभकामनाओं सहित,

+0

हालांकि मैं आपकी विधि को समझता हूं: यह संकलित नहीं हो सकता है क्योंकि आप यू 4 का उपयोग करते हैं और इसे आपके उदाहरण में परिभाषित नहीं किया है। –

+0

int u4 = 0x0000FFFF जोड़ें; – user287792

+0

यह कारण नहीं है, मुझे बस याद आती है। –

उत्तर

1

चीज़ी तरह से जब तक आप सही पर एक 1 पाने के शिफ्ट करने के लिए है आप unsigned int को सभी चर बदल देना चाहिए। लिखे गए अनुसार आप किसी भी समय सही स्थानांतरित होने पर अवांछित साइन-एक्सटेंशन प्राप्त कर सकते हैं।

+0

आपको यह जांचना चाहिए कि क्या डाला गया मान शून्य है, क्योंकि आप अनंत लूप के साथ समाप्त हो सकते हैं। –

+0

और हस्ताक्षर किए गए सही शिफ्ट पर साइन बिट क्या करता है, इसके लिए देखें, यह कार्यान्वयन-परिभाषित है। शायद सही बात यह है कि प्रश्नकर्ता के कोड के लिए हस्ताक्षर किए गए int का उपयोग करने के लिए स्विच करना है: इस पर हस्ताक्षर किए जाने का कोई कारण नहीं है और यह परेशानी के लायक नहीं है। –

4

एक समान दृष्टिकोण का उपयोग और सही 33 के परिणामस्वरूप बिट्स बदलाव उच्चतम बिट नंबर प्राप्त करें - #bits और देखा!

0

एक विधि संख्या संख्या में साइन बिट्स की अग्रणी संख्या, उस संख्या से बाएं शिफ्ट एन को खोजने के लिए और फिर इसे अपने उपरोक्त एल्गोरिदम के माध्यम से चलाया जा सकता है।

if (x != 0) { 
    while ((x & 1) == 0) { 
     x >>= 1; 
    } 
} 

नोट::

+0

यह गलत है: 1000 (उच्च बिट 3) << 3 और इस प्रकार 10000000 बन जाता है और इसके विपरीत यह 0x02000000 है, और 1 नहीं! –

+0

@Ritsaert: 1000 में 24 अग्रणी साइन बिट्स हैं, इसलिए आप इसे 24 स्थानांतरित करते हैं, 3 –

0

यह मानते हुए कि सभी 32 बिट महत्वपूर्ण हैं और पूरी चीज को उलटते हैं। आप इसे उच्चतम 1 ढूंढकर महत्वपूर्ण बिट्स की संख्या अनुमान लगाने का प्रयास कर सकते हैं, लेकिन यह आवश्यक नहीं है इसलिए मैं सुझाव दूंगा कि आप फ़ंक्शन को संशोधित करें ताकि यह महत्वपूर्ण बिट्स की संख्या को इंगित करने वाला दूसरा पैरामीटर ले। फिर बिट्स को उलटने के बाद बस उन्हें दाईं ओर स्थानांतरित करें।

0

Integer.reverse (int x) का उपयोग करने का प्रयास करें;