[英]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))
有時您只想要一個簡單的襯里:
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.