簡體   English   中英

轉換為二進制並保留前導零

[英]Convert to binary and keep leading zeros

我正在嘗試使用 Python 中的 bin() 函數將整數轉換為二進制。 但是,它始終刪除我實際需要的前導零,因此結果始終為 8 位:

例子:

bin(1) -> 0b1

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

有沒有辦法做到這一點?

使用format()函數

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

format()函數只是按照格式規范迷你語言格式化輸入。 #使格式包含0b前綴, 010大小將輸出格式化為適合 10 個字符的寬度,填充為0 2 個字符為0b前綴,另外 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'
>>> '{:08b}'.format(1)
'00000001'

請參閱: 格式規范迷你語言


注意對於 Python 2.6 或更早版本,您不能省略:之前的位置參數標識符,因此請使用

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

我在用

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

將打印

'00000001'

您可以使用字符串格式化迷你語言:

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'

編輯:基於@Martijn Pieters 的想法

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

使用 Python >= 3.6 ,最簡潔的方法是使用帶有字符串格式的f字符串

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

解釋:

  • var要格式化的變量
  • :后面的都是格式說明符
  • #使用替代形式(添加0b前綴)
  • 0用零填充
  • 10填充到10的總長度(這包括0b的 2 個字符)
  • b使用二進制表示數字

有時您只想要一個簡單的襯里:

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

蟒蛇 3

我喜歡用 python f-string 格式化一些更復雜的東西,比如在格式中使用參數:

>>> x = 5
>>> n = 8
>>> print(f"{x:0{n}b}")
00000101

在這里,我使用以下格式打印變量x :我希望它在b (二進制)格式中左填充0以具有 length = n 有關更多信息,請參閱先前答案中的格式規范迷你語言。

你可以使用這樣的東西

("{:0%db}"%length).format(num)
module Adder(
    input upperBit, lowerBit, c_in,
    output s, c_out)

write gate1, gate2, gate3

xor (gate1, upperBit, lowerBit)
xor (s, gate1, c_in)
and (upperBit, lowerBit)
and (gate1, c_in)
or  (c_out, gate1, gate2)

endmodule

module ful_adder8(
    input [7:0) a, b
    input c_in
    output [7:0) s,
    output c_out)

write [7:0] carry

full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))

endmodule
test
def split (n):
    return (n&0x1,n&0x2,n&0x4,n&0x8,n&0x10,n&0x20,n&0x40,n&0x80)
def glue (b0,b1,b2,b3,b4,b5,b6,b7,c):
    t = 0
    if b0:
        t += 1
    if b1:
        t += 2
    if b2:
        t += 4
    if b3:
        t += 8
    if b4:
        t += 16
    if b5:
        t += 32
    if b6:
        t += 64
    if b7:
        t += 128
    if c:
        t += 256
    return t


def myadd (a,b):
    (a0,a1,a2,a3,a4,a5,a6,a7) = split(a)
    (b0,b1,b2,b3,b4,b5,b6,b7) = split(b)
    (s0,s1,s2,s3,s4,s5,s6,s7,c) = addEightBits(a0,a1,a2,a3,a4,a5,a6,a7,b0,b1,b2,b3,b4,b5,b6,b7,false)
    return glue (s0,s1,s2,s3,s4,s5,s6,s7,c)

你可以使用 python 語法的 rjust 字符串方法: string.rjust(length, fillchar) fillchar 是可選的

對於您的問題,您可以這樣寫

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

所以它將是'0b00000001'

您可以使用 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) 將將 2 月份的 x 返回為“02”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM