सी में बिट्स का सही रोटेशन
मैं 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
। स्पष्ट रूप से, बाईं-बिट को सेट करने के लिए मेरा तरीका काम नहीं कर रहा है जैसा कि मैं उससे उम्मीद करता हूं। क्या किसी को स्पष्ट त्रुटि दिखाई देती है? मैं बस बिट्स और इस तरह से कब्जा करने के बारे में सीख रहा हूं।
नोट: मुझे इस पोस्ट से बाईं-सबसे बिट सेट करने की तकनीक मिली ।
जवाब
आइए विश्लेषण करते हैं (~0 ^ (~0 >> 1) )
:
~0
है -1
~0 >> 1
फिर से है -1
, तो संकेत सा है, 1
rightshift के साथ नए बिट्स भर जाएगा 1
रों।
-1 ^ -1
है 0
।
x = x | 0
है x
।
समाधान यह है कि यदि आप बिटकॉइन करना चाहते हैं, तो आपको अहस्ताक्षरित डेटाटिप्स का उपयोग करना चाहिए।
तो आपको लाइन का उपयोग करना चाहिए x = x | (~0u ^ (~0u >> 1) );
अन्य समस्याओं से बचने के लिए पैरामीटर x
भी होना चाहिए unsigned int
।
https://ideone.com/7zPTQk