बाइनरी में कनवर्ट करें और पायथन में अग्रणी शून्य रखें


154

मैं पायथन में बिन () फ़ंक्शन का उपयोग करके एक पूर्णांक को बाइनरी में बदलने की कोशिश कर रहा हूं। हालांकि, यह हमेशा अग्रणी शून्य को हटाता है, जिसकी मुझे वास्तव में आवश्यकता होती है, जैसे कि परिणाम हमेशा 8-बिट होता है:

उदाहरण:

bin(1) -> 0b1

# What I would like:
bin(1) -> 0b00000001

क्या इसे करने का कोई तरीका है?


यह भी देखें: बाइनरी को पायथन इंट? , विशेष रूप से n- बिट प्रतिनिधित्व के साथ मेरा जवाब । ठीक वैसा ही नहीं, लेकिन मैं इस सवाल पर आया था मेरे जवाब की खोज ...
मार्टिन थोमा

जवाबों:


220

format()फ़ंक्शन का उपयोग करें :

>>> format(14, '#010b')
'0b00001110'

format()समारोह बस निम्नलिखित इनपुट स्वरूपों स्वरूप विशिष्टता मिनी भाषा#प्रारूप में शामिल करता है 0bउपसर्ग, और 010आकार उत्पादन 10 अक्षर में फिट करने के साथ चौड़ाई, स्वरूपों 0गद्दी; 0bउपसर्ग के लिए 2 वर्ण , बाइनरी अंक के लिए अन्य 8।

यह सबसे कॉम्पैक्ट और प्रत्यक्ष विकल्प है।

यदि आप परिणाम को एक बड़े स्ट्रिंग में डाल रहे हैं, तो एक स्वरूपित स्ट्रिंग शाब्दिक (3.6+) का उपयोग करें या प्लेसहोल्डर के कोलन के बाद फ़ंक्शन के str.format()लिए दूसरा तर्क रखें :format(){:..}

>>> value = 14
>>> f'The produced output, in binary, is: {value:#010b}'
'The produced output, in binary, is: 0b00001110'
>>> 'The produced output, in binary, is: {:#010b}'.format(value)
'The produced output, in binary, is: 0b00001110'

जैसा कि होता है, यहां तक ​​कि केवल एक मान को स्वरूपित करने के लिए (इसलिए परिणाम को एक बड़े स्ट्रिंग में डाले बिना), एक स्वरूपित स्ट्रिंग शाब्दिक का उपयोग करना उपयोग करने की तुलना में तेज है format():

>>> import timeit
>>> timeit.timeit("f_(v, '#010b')", "v = 14; f_ = format")  # use a local for performance
0.40298633499332936
>>> timeit.timeit("f'{v:#010b}'", "v = 14")
0.2850222919951193

लेकिन मैं इसका उपयोग केवल तभी करूंगा जब एक तंग पाश मामलों में प्रदर्शन, जैसा format(...)कि इरादे को बेहतर बताता है।

यदि आप 0bउपसर्ग नहीं चाहते हैं , तो बस ड्रॉप करें #और फ़ील्ड की लंबाई समायोजित करें:

>>> format(14, '08b')
'00001110'

3
वास्तव में मैं जो देख रहा था, यह प्रारूपण वास्तव में मेरे लिए उपयोगी है। मैंने बिट हेरफेर सीखना शुरू कर दिया है और मैं पायथन में संख्याओं के लिए बिट फॉर्मेटिंग के लिए जा रहा था। यह मिला। धन्यवाद।
kratostoical

अच्छा काम करता है। हालांकि थोड़ा भारी हो सकता है। format(192,'08b')+'.'+format(0,'08b')+'.'+format(2,'08b')+'.'+format(33,'08b') 11000000.00000000.00000010.00100001
आवाजें

@ tjt263: यह के कारण है कि मैं स्पष्ट रूप से कहा गया है कि आप एक बड़ा स्ट्रिंग में परिणाम डाल रहे हैं, तो एक स्वरूपित स्ट्रिंग शाब्दिक (3.6+) या उपयोग का उपयोग str.format()और प्लेसहोल्डर के कोलन के बाद प्रारूप () फ़ंक्शन के लिए दूसरा तर्क रखा {:..}:
मार्टिन पीटर्स

1
@ tjt263: उदाहरण के लिए उपयोग करें f"{192:08b}.{0:08b}.{2:08b}.{33:08b}"
मार्टिन पीटर्स

बहुत अच्छा। मुझे कभी नहीं पता होता कि आप अकेले स्पष्टीकरण से क्या मतलब है। लेकिन अब मैंने आपका उदाहरण देखा है, मैं शायद इसे कभी नहीं भूलूंगा। चीयर्स।
आवाजें

115
>>> '{:08b}'.format(1)
'00000001'

देखें: प्रारूप विशिष्टता मिनी भाषा


पायथन 2.6 या उससे अधिक उम्र के लिए ध्यान दें, आप पहले स्थितीय तर्क पहचानकर्ता को छोड़ नहीं सकते :, इसलिए उपयोग करें

>>> '{0:08b}'.format(1)
'00000001'      

3
str.format()कब format()क्या करेंगे यहां इस्तेमाल करने की कोई जरूरत नहीं है। आप 0bउपसर्ग याद कर रहे हैं ।
मार्टिन पीटर्स

2
@MartijnPieters, str.formatकी तुलना में अधिक लचीला है format()क्योंकि यह आपको एक साथ कई चर करने की अनुमति देगा। मैं भूल जाता हूं कि formatफ़ंक्शन भी मौजूद है। बेशक यह इस मामले में पूरी तरह से पर्याप्त है।
मार्क रंसोम

1
@MarkRansom: वास्तव में, जब आप केवल str.format()एक {}तत्व के साथ उपयोग कर रहे हैं , कोई अन्य पाठ नहीं, आप स्ट्रिंग टेम्प्लेटिंग का उपयोग नहीं कर रहे हैं, तो आप एक मान का प्रारूपण कर रहे हैं । उस मामले में बस का उपयोग करें format()। :-)
मार्टिन पीटर्स

30

मै इस्तेमाल कर रहा हूँ

bin(1)[2:].zfill(8)

छप जाएगा

'00000001'

9

आप स्ट्रिंग स्वरूपण मिनी भाषा का उपयोग कर सकते हैं:

def binary(num, pre='0b', length=8, spacer=0):
    return '{0}{{:{1}>{2}}}'.format(pre, spacer, length).format(bin(num)[2:])

डेमो:

print binary(1)

आउटपुट:

'0b00000001'

EDIT: @Martijn Pieters विचार पर आधारित

def binary(num, length=8):
    return format(num, '#0{}b'.format(length + 2))

2
आपके लिए उपसर्ग शामिल करने के लिए उसी स्वरूपण भाषा का उपयोग किया जा सकता है। का उपयोग करें #। वहाँ भी है format(), जो आपको एक पूर्ण स्ट्रिंग टेम्पलेट करने के लिए बचाता है।
मार्टिन पीटर्स

2

पायथन का उपयोग करते समय >= 3.6, सबसे बेहतर तरीका स्ट्रिंग प्रारूपण के साथ एफ-स्ट्रिंग्स का उपयोग करना है :

>>> var = 23
>>> f"{var:#010b}"
'0b00010111'

स्पष्टीकरण:

  • var स्वरूप के लिए चर
  • : इसके बाद सब कुछ प्रारूप निर्दिष्ट है
  • #वैकल्पिक रूप का उपयोग करें ( 0bउपसर्ग जोड़ता है )
  • 0 शून्य के साथ पैड
  • 1010 से कुल लंबाई तक पैड (इसमें 2 वर्ण शामिल हैं 0b)
  • b संख्या के लिए द्विआधारी प्रतिनिधित्व का उपयोग करें

नहीं, यह सबसे साफ नहीं है , तब तक नहीं जब तक आप स्ट्रिंग के साथ सिर्फ एक ही स्थान पर नहीं करते । अन्यथा format(var, "#010b")संचार इरादे काफी बेहतर। हालांकि, यह सबसे तेज विकल्प है। लेकिन आप जानते हैं कि पहले से ही, सही है, क्योंकि मैं पहले से ही अपने उत्तर में जो कुछ भी पोस्ट करता हूं, उसे कवर करता हूं।
मार्टिन पीटर्स

1

कभी-कभी आप बस एक साधारण लाइनर चाहते हैं:

binary = ''.join(['{0:08b}'.format(ord(x)) for x in input])

अजगर ३


1
ध्यान दें कि [ ]जरूरत नहीं होनी चाहिए - join()एक जनरेटर अभिव्यक्ति को स्वीकार करता है। ''.join('{0:08b}'.format(ord(x)) for x in input)
क्रिस्टोफ बुर्शका

@ChristophBurschka ध्यान दें कि क्योंकि str.join()दो पास बनाने की आवश्यकता है, एक जनरेटर इनपुट को पहली बार शामिल होने से पहले एक सूची में बदल दिया जाता है। यह प्रदर्शन पर एक टोल लेता है और क्या यह वास्तव में बेहतर है कि एक जनरेटर अभिव्यक्ति के बजाय एक सूची समझ में पारित करने के लिए। यह एक है अगर वे नियम के अपवाद हैं।
मार्टिन पीटर्स

-1

आप कुछ इस तरह का उपयोग कर सकते हैं

("{:0%db}"%length).format(num)

2
कृपया अपने कोड स्निपेट के लिए कम से कम कोड ब्लॉक का उपयोग करें। और यदि आप वास्तव में चाहते हैं कि यह एक अच्छा उत्तर हो, तो यह भी टिप्पणी जोड़ें कि यह समाधान ओपी प्रश्न को क्यों हल कर रहा है।
β.βοιτ.βε

आपको एक चर चौड़ाई जोड़ने के लिए एक अलग स्ट्रिंग प्रारूपण शैली का उपयोग करने की आवश्यकता नहीं है। : बस एक और प्लेसहोल्डर जोड़ने"{:0{l}b}".format(num, l=length)
मार्टिन पीटर्स

-1

आप पायथन सिंटैक्स की अन्यायपूर्ण स्ट्रिंग विधि का उपयोग कर सकते हैं: string.rjust (length, fillchar) फिलचर वैकल्पिक है

और अपने प्रश्न के लिए आप इस तरह से लिख सकते हैं

'0b'+ '1'.rjust(8,'0)

तो यह '0b00000001' हो जाएगा


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

-3

आप zfill का उपयोग कर सकते हैं:

print str(1).zfill(2) 
print str(10).zfill(2) 
print str(100).zfill(2)

प्रिंट:

01
10
100

मुझे यह समाधान पसंद है, क्योंकि यह न केवल संख्या को आउटपुट करते समय मदद करता है, लेकिन जब आपको इसे एक चर को असाइन करने की आवश्यकता होती है ... जैसे - x = str (datetime.date.today ()। month) .zfill (2) होगा। फे के महीने के लिए '02' के रूप में वापसी x।


1
zfill के साथ समस्या यह है कि यह एक स्ट्रिंग की तरह द्विआधारी स्ट्रिंग का इलाज करता है और द्विआधारी 'b' संकेतक से पहले शून्य जोड़ता है ... उदाहरण के लिए bin(14) `0b1110 '` bin(14).zfill(8) देता है और `` 000b1110' `` `0b0000111010` `देता है जो कि वांछित है
शॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.