2012-10-01 15 views
19

एक दशमलव पूर्णांक (उदाहरण 65) को देखते हुए, पाइथन में अंतर्निहित बिट्स को कैसे उलटता है? अर्थात। निम्नलिखित आपरेशन:पायथन पूर्णांक

65 → 01000001 → 10000010 → 130 

ऐसा लगता है कि इस कार्य को तीन चरणों में बांटा जा सकता है:

  1. बिट्स रिवर्स द्विआधारी प्रतिनिधित्व
  2. में कनवर्ट दशमलव पूर्णांक
  3. दशमलव के लिए वापस कन्वर्ट

चरण # 2 और 3 बहुत सरल दिखते हैं (देखेंऔर this चरण # 2 से संबंधित SO प्रश्न), लेकिन मैं चरण # 1 पर फंस गया हूं। चरण # 1 के साथ समस्या शून्य भरने के साथ पूर्ण दशमलव प्रतिनिधित्व पुनर्प्राप्त कर रही है (यानी 65 = 01000001, 1000001 नहीं)।

मैंने चारों ओर खोज की है, लेकिन मुझे कुछ भी नहीं मिल रहा है।

+1

चरण एक के लिए, आप 'str (bin (65)) [2:] का उपयोग कर सकते हैं। Zfill (8)'। इस में आगे देखने के लिए आलसी/थके हुए। लेकिन आपको शायद लार्समैन के रूप में बस करना चाहिए। – BrtH

उत्तर

27
int('{:08b}'.format(n)[::-1], 2) 

आप क्या तुम सच में फैंसी प्राप्त करना चाहते हैं 8. के ​​स्थान पर किसी भी भरने लंबाई निर्दिष्ट कर सकते हैं,

b = '{:0{width}b}'.format(n, width=width) 
int(b[::-1], 2) 

आपको चौड़ाई को प्रोग्रामेटिक रूप से निर्दिष्ट करने देता है।

+1

सुरुचिपूर्ण और संक्षिप्त। मुझे प्रारूप स्ट्रिंग को '' {: 08b} '' को निर्दिष्ट के रूप में कार्य करने की आवश्यकता है। –

+0

आह, हाँ, वह भरने वाले शून्य चाहते थे। मैं संशोधन करूंगा – nneonneo

+0

यदि मैं 'int ('{: b}' प्रारूप (65) [:: - 1], 2) करता हूं, तो मुझे आउटपुट के रूप में' 65' मिलता है। '{: B}' के बजाय '{: 08b}' का उपयोग करना सही परिणाम देता है, इसलिए सुरुचिपूर्ण समाधान के लिए +1। – BrtH

4

"दशमलव पूर्णांक को बाइनरी प्रतिनिधित्व में परिवर्तित करने" की कोई ज़रूरत नहीं है, और कोई रास्ता नहीं है। सभी पायथन पूर्णांक बाइनरी के रूप में दर्शाए जाते हैं; जब आप उन्हें सुविधा के लिए प्रिंट करते हैं तो वे केवल दशमलव में परिवर्तित हो जाते हैं।

यदि आप उलटा समस्या में this solution का पालन करना चाहते हैं, तो आपको केवल उचित numbits मिलना होगा। आप इसे हाथ से निर्दिष्ट कर सकते हैं, या n.bit_length() के साथ एक पूर्णांक n का प्रतिनिधित्व करने के लिए आवश्यक बिट्स की संख्या की गणना कर सकते हैं।

हालांकि, 65 के लिए, यह आपको 7 देगा, क्योंकि कोई कारण नहीं है कि 65 को और बिट्स की आवश्यकता क्यों होनी चाहिए। (आप 8 के निकटतम गुणज तक पूर्णांक बनाना चाहते हो सकता है ...)

+0

वास्तव में सही नहीं है, क्योंकि आप बिट्स ('bin (n)', या '' {: b} 'प्रारूप (एन) ') का प्रतिनिधित्व करने वाली स्ट्रिंग प्राप्त कर सकते हैं। इसके अलावा, आप किसी संख्या का प्रतिनिधित्व करने के लिए आवश्यक बिट्स की सटीक संख्या को खोजने के लिए '.bit_length()' का उपयोग कर सकते हैं। – nneonneo

+0

@nneonneo: मुझे लगता है कि ओपी लिंक को दिए गए स्ट्रिंग प्रस्तुति के बजाय पूर्णांक पर काम करना चाहता है। लेकिन 'bit_length' विधि के लिए धन्यवाद, इसके बारे में नहीं पता था। –

4

आप और अधिक गति के बाद कर रहे हैं, तो आप http://leetcode.com/2011/08/reverse-bits.html

def reverse_mask(x): 
    x = ((x & 0x55555555) << 1) | ((x & 0xAAAAAAAA) >> 1) 
    x = ((x & 0x33333333) << 2) | ((x & 0xCCCCCCCC) >> 2) 
    x = ((x & 0x0F0F0F0F) << 4) | ((x & 0xF0F0F0F0) >> 4) 
    x = ((x & 0x00FF00FF) << 8) | ((x & 0xFF00FF00) >> 8) 
    x = ((x & 0x0000FFFF) << 16) | ((x & 0xFFFF0000) >> 16) 
    return x 
2

में तकनीक का वर्णन का उपयोग आप एक पारी और मुखौटा का उपयोग करके एक नंबर के i'th बिट परीक्षण कर सकते हैं कर सकते हैं। उदाहरण के लिए, 65 का बिट 6 (65 >> 6) & 1 है। आप सही तरीके से 1 को स्थानांतरित करके एक ही तरीके से थोड़ा सा सेट कर सकते हैं। ये अंतर्दृष्टि आपको इस तरह के कोड प्रदान करती हैं (जो 'एन' बिट्स के क्षेत्र में एक्स को उलट देती है)।

def reverse(x, n): 
    result = 0 
    for i in xrange(n): 
     if (x >> i) & 1: result |= 1 << (n - 1 - i) 
    return result 

print bin(reverse(65, 8)) 
3
def reverse_bit(num): 
    result = 0 
    while num: 
     result = (result << 1) + (num & 1) 
     num >>= 1 
    return result 

हम वास्तव में, द्विआधारी में पूर्णांक कन्वर्ट करने के लिए की जरूरत नहीं है के बाद से पूर्णांकों वास्तव में अजगर में बाइनरी हैं।

उलटा विचार पूर्णांक के इन-स्पेस रिवर्सिंग करने जैसा है।

def reverse_int(x): 
    result = 0 
    pos_x = abs(x) 
    while pos_x: 
     result = result * 10 + pos_x % 10 
     pos_x /= 10 
    return result if x >= 0 else (-1) * result 

प्रत्येक पाश के लिए, मूल संख्या सही-बाएं (बाइनरी में) छोड़ रही है। जब हम नया बिट जोड़ते हैं तो हमें अगले लूप में यह सही-सबसे छोटा और गुणा 2 (<<1) मिलता है।

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