বাইনারিতে রূপান্তর করুন এবং পাইথনে নেতৃস্থানীয় শূন্যগুলি বজায় রাখুন


154

আমি পাইথনে বিন () ফাংশনটি ব্যবহার করে একটি পূর্ণসংখ্যাকে বাইনারি রূপান্তরিত করার চেষ্টা করছি। তবে, এটি সর্বদা অগ্রণী জিরোগুলি সরিয়ে দেয়, যা আমার আসলে প্রয়োজন, ফলাফলটি সর্বদা 8-বিট হয়:

উদাহরণ:

bin(1) -> 0b1

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

এটি করার কোন উপায় আছে?


আরও দেখুন: পাইথন ইন টু বাইনারি? বিশেষত এন-বিট উপস্থাপনের সাথে আমার উত্তর with ঠিক একই রকম নয়, তবে আমি আমার উত্তর অনুসন্ধান করতে এই প্রশ্নে এসেছি ...
মার্টিন থোমা

উত্তর:


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

তবে আমি এটি কেবল তখনই ব্যবহার করব যদি কোনও দৃ tight় লুপের ক্ষেত্রে পারফরম্যান্স যেমন 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'

দেখুন: ফর্ম্যাট নির্দিষ্টকরণ মিনি-ভাষা


পাইথন ২.6 বা তার বেশি বয়সীদের জন্য দ্রষ্টব্য, আপনি এর আগে অবস্থানগত যুক্তি শনাক্তকারীকে বাদ দিতে পারবেন না :, তাই ব্যবহার করুন

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

3
str.format()কখন format()করবে তা এখানে ব্যবহার করার দরকার নেই । আপনি 0bউপসর্গটি মিস করছেন ।
মার্টিজন পিটারস

2
@ মার্তিজনপিটারস, এর str.formatচেয়ে আরও নমনীয় format()কারণ এটি আপনাকে একসাথে একাধিক ভেরিয়েবল করার অনুমতি দেয়। আমি ভুলে যেতে থাকি যে formatফাংশনটি এমনকি রয়েছে। স্বীকারযোগ্যভাবে এই ক্ষেত্রে এটি পুরোপুরি পর্যাপ্ত।
মার্ক রান্সম

1
@ মার্করান্সম: ঠিক আপনি যখন 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'

সম্পাদনা: @ মার্তিজন পিটার্স ধারণার উপর ভিত্তি করে

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 শূন্য সঙ্গে প্যাড
  • 10প্যাড মোট দৈর্ঘ্য 10 এ (এটিতে 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)
ক্রিস্টোফ বার্সকা

@ ক্রিসটফবার্শকা নোট করুন যেহেতু str.join()দুটি পাস করা দরকার, তাই জেনারেটরের ইনপুটটিকে যোগদানের আগে প্রথমে একটি তালিকায় রূপান্তর করা হয়। পারফরম্যান্সে এটি বেশ খানিকটা সময় নেয় এবং এখানে জেনারেটর এক্সপ্রেশন না হয়ে তালিকা বোধগম্যতায় পাস করা ভাল । এটি নিয়মে ব্যতিক্রম হলে এটি এক।
Martijn Pieters

-1

আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন

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

2
আপনার কোড স্নিপেটের জন্য কমপক্ষে কোড ব্লকটি ব্যবহার করুন। এবং যদি আপনি সত্যিই এটির একটি উত্তরের উত্তর হতে চান, তবে কেন এই সমাধানটি ওপি প্রশ্নের সমাধান করছে তা নিয়ে কিছু মন্তব্য যুক্ত করুন।
εηοιτ.εηοιτ.βε

কেবলমাত্র একটি ভেরিয়েবল প্রস্থ যুক্ত করতে আপনাকে আলাদা স্ট্রিং বিন্যাসের স্টাইল ব্যবহার করার দরকার নেই। কেবলমাত্র অন্য স্থানধারক যুক্ত করুন:"{:0{l}b}".format(num, l=length)
মার্টিজন পিটার

-1

আপনি পাইথন সিনট্যাক্সের সর্ট স্ট্রিং পদ্ধতিটি ব্যবহার করতে পারেন: স্ট্রিং.আরজেড (দৈর্ঘ্য, ফিলচার) ফিলচারটি alচ্ছিক

এবং আপনার প্রশ্নের জন্য আপনি এইভাবে লিখুন n

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

সুতরাং এটি '0b00000001' হবে


একটি সিনট্যাক্স ত্রুটি আছে। তবে আরও গুরুত্বপূর্ণ, এটি প্রশ্নের কোনও উত্তর দেয় না, যা intএকটিটিকে তার পাঠ্য বাইনারি উপস্থাপনায় রূপান্তরিত করার বিষয়ে; আপনি এমনকি একটি দিয়ে শুরু করবেন না int
থিয়েরি লাথুয়েল

-3

আপনি জিফিল ব্যবহার করতে পারেন:

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

কপি করে প্রিন্ট:

01
10
100

আমি এই সমাধানটি পছন্দ করি, কারণ এটি কেবলমাত্র সংখ্যাটি আউটপুট দেওয়ার সময়ই সহায়তা করে না, তবে যখন আপনাকে এটি একটি ভেরিয়েবলের জন্য বরাদ্দ করা দরকার ... উদাহরণস্বরূপ - x = str (ডেটটাইম.ডেট.টোডে ()। মাস) .জফিল (2) উইল করবে ফেব্রের মাসের জন্য x '02' হিসাবে ফিরে আসুন।


1
জিফিলের সাথে সমস্যা হ'ল এটি বাইনারি স্ট্রিংটিকে স্ট্রিংয়ের মতো আচরণ করে এবং বাইনারি 'বি' সূচকের আগে শূন্য যুক্ত করে ... উদাহরণস্বরূপ `'0b1110'` দেয় bin(14) এবং bin(14).zfill(8)000 '000b1110' দেয় `'0b00001110'` যা পছন্দসই নয়
শান 20 ই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.