Chuyển đổi số nguyên thành nhị phân trong python


179

Để chuyển đổi một số nguyên thành nhị phân, tôi đã sử dụng mã này:

>>> bin(6)  
'0b110'

và khi xóa '0b', tôi sử dụng:

>>> bin(6)[2:]  
'110'

Tôi có thể làm gì nếu tôi muốn thể hiện 6như 00000110thay vì 110?


Câu trả lời:


355
>>> '{0:08b}'.format(6)
'00000110'

Chỉ để giải thích các phần của chuỗi định dạng:

  • {} đặt một biến thành một chuỗi
  • 0 lấy biến ở vị trí đối số 0
  • :thêm tùy chọn định dạng cho biến này (nếu không nó sẽ biểu thị thập phân 6)
  • 08 định dạng số thành tám chữ số không đệm ở bên trái
  • b chuyển đổi số thành biểu diễn nhị phân của nó

Nếu bạn đang sử dụng phiên bản Python 3.6 trở lên, bạn cũng có thể sử dụng chuỗi f:

>>> f'{6:08b}'
'00000110'

7
Đầu tiên 0có nghĩa là 0thđối số để format. Sau dấu hai chấm là định dạng, thứ hai 0có nghĩa là không điền vào 8 khoảng trắng và bcho nhị phân
jamylak

@Aif: Ngoài ra, có một cái nhìn tại các tài liệu tiêu chuẩn docs.python.org/library/...
PEPR

19
Điều này có thể được đơn giản hóa với format() chức năng : format(6, '08b'); hàm lấy một giá trị (những gì {..}vị trí áp dụng cho) và một đặc tả định dạng (bất cứ điều gì bạn sẽ đặt sau :chuỗi định dạng).
Martijn Pieters

4
'{0:08b}'.format(-6)-> '-0000110'. Điều gì nếu bạn không muốn một dấu hiệu? struct? -6%256?
n611x007

1
@ AK47 Có, kể từ Pythoon 2.6, bạn có thể viết các hằng số int ở dạng nhị phân với tiền tố 0b
Denis Barmenkov

102

Chỉ là một ý tưởng khác:

>>> bin(6)[2:].zfill(8)
'00000110'

Con đường ngắn hơn thông qua nội suy chuỗi ( Python 3.6+ ):

>>> f'{6:08b}'
'00000110'

7
Lưu ý rằng giải pháp này nhanh hơn giải pháp được chấp nhận . Giải pháp nào rõ ràng hơn (hoặc, tôi dám nói là, Pythonic) có lẽ là vấn đề sở thích cá nhân.
Không khí

Tôi vẫn đang học bản chất của pythonicity, nhưng điều này rõ ràng linh hoạt hơn nhiều. Ban đầu tôi rất phấn khích khi thấy giải pháp được chấp nhận với lời giải thích tao nhã của nó, nhưng đã báo động rằng đối tượng được gọi để thực hiện các phương thức được viết dưới dạng một chuỗi với tất cả các thông số kỹ thuật được xây dựng, loại bỏ sự liên quan của các biến trong những thứ như độ dài mong muốn của chuỗi bit. Điều này giải quyết hoàn toàn điều đó và rất trực quan (ít nhất là đối với Python 2) mà không cần phải giải thích từng ký tự!
Post169 20/03/18

Không hoạt động cho số nguyên âm bin(-6)[2:].zfill(8)đọc là'0000b110'
jlandercy

20

Một phương pháp vặn vẹo một chút ...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'

1
Phương pháp tốt đẹp. Nhưng tôi không thể hiểu phần này của mã của bạn đang làm gì: str ((x >> i) & 1)
Gregory

2
@Gregory: nó dịch chuyển các bit xsang phải và AND với nó 1, trích xuất hiệu quả một bit (0 hoặc 1) tại một thời điểm.
usr2564301

16

Chỉ cần sử dụng chức năng định dạng

format(6, "08b")

Hình thức chung là

format(<the_integer>, "<0><width_of_string><format_specifier>")

1
Vâng, tôi thích cái này, nó đơn giản và là một trong những thứ nhanh nhất :-) 1000000 loops, best of 3: 556 ns per loop
SebMa

10

Câu trả lời của eumiro là tốt hơn, tuy nhiên tôi chỉ đăng bài này cho đa dạng:

>>> "%08d" % int(bin(6)[2:])
00000110

3
Heh. Điều này là rất sai lầm, tôi đã phải nâng cao nó. Giải thích các chữ số là số thập phân là xảo quyệt. Tệ hơn nữa:'%08x' % int(bin(6)[2:], 16)
Nhà vật lý điên

6

.. hoặc nếu bạn không chắc chắn nó phải luôn có 8 chữ số, bạn có thể chuyển nó dưới dạng tham số:

>>> '%0*d' % (8, int(bin(6)[2:]))
'00000110'

5

numpy.binary_repr(num, width=None) có một đối số chiều rộng ma thuật

Các ví dụ liên quan từ tài liệu được liên kết ở trên:

>>> np.binary_repr(3, width=4)
'0011'

Phần bù của hai được trả về khi số đầu vào là âm và chiều rộng được chỉ định:

>>> np.binary_repr(-3, width=5)
'11101'

4

Đi học cũ luôn hoạt động.

def intoBinary(number):
binarynumber=""
if (number!=0):
    while (number>=1):
        if (number %2==0):
            binarynumber=binarynumber+"0"
            number=number/2
        else:
            binarynumber=binarynumber+"1"
            number=(number-1)/2

else:
    binarynumber="0"

return "".join(reversed(binarynumber))

number=number/2cho phao, vì vậy number=number//2các đường may tốt hơn, tôi cũng sẽ thay thế number=number//2bằng number//=2b=b+"0"vớib+="0"
Brambor

Ngoài ra, bạn không có phần đệm 0 như OP yêu cầu
Brambor

1
('0' * 7 + bin(6)[2:])[-8:]

hoặc là

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side

2
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Nic3500

0

Giả sử bạn muốn phân tích số chữ số được sử dụng để biểu thị từ một biến không phải luôn luôn là hằng số, một cách tốt sẽ là sử dụng numpy.binary.

có thể hữu ích khi bạn áp dụng nhị phân cho các bộ sức mạnh

import numpy as np
np.binary_repr(6, width=8)

0

Cách tốt nhất là chỉ định định dạng.

format(a, 'b')

trả về giá trị nhị phân của một định dạng chuỗi.

Để chuyển đổi một chuỗi nhị phân trở lại số nguyên, sử dụng hàm int ().

int('110', 2)

trả về giá trị nguyên của chuỗi nhị phân.


Tốt hơn là định dạng (a, '08b') để có được định dạng mà người dùng muốn.
ZSG

0
def int_to_bin(num, fill):
    bin_result = ''

    def int_to_binary(number):
        nonlocal bin_result
        if number > 1:
            int_to_binary(number // 2)
        bin_result = bin_result + str(number % 2)

    int_to_binary(num)
    return bin_result.zfill(fill)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.