सी में बिट्स का सही रोटेशन

Jan 03 2021

मैं K & R में व्यायाम 2-8 पर काम कर रहा हूं, जो हमें फ़ंक्शन लिखने के लिए कहता है ताकि rightrot(int x, int n)सभी बिट्स xको दाएं-छोर पर दाएं-बाएं स्थानांतरित कर दिया जाए, जो दाएं-बाएं बंद हो जाएं और बाएं-छोर पर फिर से दिखाई दें।

यहां मेरा प्रयास समाधान है जिसमें मैं प्रत्येक बिट को एक-एक करके स्थानांतरित करता हूं:

int rightrot(int x, int n)
{
    int i, rmb;

    for(i = 0; i < n; ++i)
    {
        // get right-most bit
        rmb = x & 1;

        // shift 1 to right
        x = x >> 1;

        // if right-most bit is set, set left-most bit
        if (rmb == 1)
            x = x | (~0 ^ (~0 >> 1) );
    }

    return x;
}

जब मैं निष्पादित करता हूं rightrot(122, 2), मुझे उम्मीद है कि 94चूंकि 122है 1111010और 94है 1011110। इसके बजाय, मुझे वह मिलता है 30जो होना होता है 0011110। स्पष्ट रूप से, बाईं-बिट को सेट करने के लिए मेरा तरीका काम नहीं कर रहा है जैसा कि मैं उससे उम्मीद करता हूं। क्या किसी को स्पष्ट त्रुटि दिखाई देती है? मैं बस बिट्स और इस तरह से कब्जा करने के बारे में सीख रहा हूं।

नोट: मुझे इस पोस्ट से बाईं-सबसे बिट सेट करने की तकनीक मिली ।

जवाब

7 mch Jan 02 2021 at 23:21

आइए विश्लेषण करते हैं (~0 ^ (~0 >> 1) ):

~0है -1
~0 >> 1फिर से है -1, तो संकेत सा है, 1rightshift के साथ नए बिट्स भर जाएगा 1रों।
-1 ^ -1है 0
x = x | 0है x

समाधान यह है कि यदि आप बिटकॉइन करना चाहते हैं, तो आपको अहस्ताक्षरित डेटाटिप्स का उपयोग करना चाहिए।

तो आपको लाइन का उपयोग करना चाहिए x = x | (~0u ^ (~0u >> 1) );
अन्य समस्याओं से बचने के लिए पैरामीटर xभी होना चाहिए unsigned int

https://ideone.com/7zPTQk