Answers:
str.format()
仅格式化一个值就太过分了。直接进入format()
函数:format(n, 'b')
。无需解析占位符并将其与参数匹配,就直接进行值格式化操作本身。仅str.format()
在需要将格式化结果放在更长的字符串中时使用(例如,将其用作模板)。
0
到格式字符串:format(10, '016b')
格式化为带前导零的16位数字。
0
,"{0:b}"
可以删除in 吗?我的意思是,在仅格式化一个数字的情况下,正确输入"{:b}"
是不是?
"{:08b}".format(37)
str(bin(i))[2:]
(1000000ops为0.369s)比"{0:b}".format(i)
(1000000ops为0.721s)
str.format()
还是错误的工具,您应该使用它format(i, 'b')
。考虑到这也给您填充和对齐选项;format(i, '016b')
格式化为16位零填充二进制数。为此,bin()
您必须添加一个str.zfill()
呼叫:(bin(i)[2:].zfill(16)
无需呼叫str()
!)。format()
的可读性和灵活性(使用很难进行动态格式化bin()
)是一个很大的权衡,除非必须这样做,否则请不要为性能而优化,然后再针对可维护性进行优化。
f"{37:b}"
。
Python的实际确实已经内建了对这个东西,做如操作的能力'{0:b}'.format(42)
,这将给你的位模式(在一个字符串)42
,或101010
。
对于更一般的哲学,没有语言或库会向用户群提供他们想要的一切。如果您所处的环境不能完全满足您的需求,则在开发过程中应收集代码片段,以确保您不必重复编写同一件事。例如伪代码:
define intToBinString, receiving intVal:
if intVal is equal to zero:
return "0"
set strVal to ""
while intVal is greater than zero:
if intVal is odd:
prefix "1" to strVal
else:
prefix "0" to strVal
divide intVal by two, rounding down
return strVal
它将根据十进制值构造您的二进制字符串。请记住,这是伪代码的通用位,虽然这可能不是最有效的方式,但是您似乎建议进行迭代,但这并没有太大的区别。它实际上只是作为如何完成操作的指南。
总体思路是使用代码(按优先顺序排列):
s = "1" + s
和s = "0" + s
行中。每个都不必要地复制s。您应该在返回字符串之前反转字符串。
'{0:b}'.format(42)
是慢速方法,只是该方法的一般示例,根据实际使用的语言,它可能为O(n ^ 2),也可能不是O(n ^ 2)。它看起来像Python,因为Python是理想的伪代码语言,因此我将对其进行更改以使其更加清晰。
s = "1" + s
当s
它是字符串类型时不是O(N)。也许是一种所有字符串都向后存储或每个字符都是链表中的节点的语言?对于任何典型的语言,字符串基本上都是字符数组。在这种情况下,给字符串加上前缀需要进行复制,否则您将如何将该字符放在其他字符之前?
如果要使用不带0b前缀的文本表示形式,则可以使用以下代码:
get_bin = lambda x: format(x, 'b')
print(get_bin(3))
>>> '11'
print(get_bin(-3))
>>> '-11'
当您需要n位表示形式时:
get_bin = lambda x, n: format(x, 'b').zfill(n)
>>> get_bin(12, 32)
'00000000000000000000000000001100'
>>> get_bin(-12, 32)
'-00000000000000000000000000001100'
或者,如果您更喜欢具有以下功能:
def get_bin(x, n=0):
"""
Get the binary representation of x.
Parameters
----------
x : int
n : int
Minimum number of digits. If x needs less digits in binary, the rest
is filled with zeros.
Returns
-------
str
"""
return format(x, 'b').zfill(n)
format(integer, 'b')
。bin()
是一个调试工具,专门用于产生Python二进制整数文字语法,format()
旨在产生特定格式。
bin()
是一个旨在产生Python二进制整数文字语法的调试工具?我在文档中找不到。
oct()
和和相同hex()
。
str.zfill()
可以使用str.format()
或将其format()
与动态第二个参数结合使用:'{0:0{1}b}'.format(x, n)
或format(b, '0{}b'.format(n))
。
zfill
比动态第二个参数更易于阅读和理解,因此我将继续保留。
作为参考:
def toBinary(n):
return ''.join(str(1 & int(n) >> i) for i in range(64)[::-1])
此函数可以转换一个大的正整数18446744073709551615
,以string表示'1111111111111111111111111111111111111111111111111111111111111111'
。
可以修改它以使用更大的整数,尽管它可能不如"{0:b}".format()
或方便bin()
。
带lambda的单线:
>>> binary = lambda n: '' if n==0 else binary(n/2) + str(n%2)
测试:
>>> binary(5)
'101'
编辑:
但是之后 :(
t1 = time()
for i in range(1000000):
binary(i)
t2 = time()
print(t2 - t1)
# 6.57236599922
相较于
t1 = time()
for i in range(1000000):
'{0:b}'.format(i)
t2 = time()
print(t2 - t1)
# 0.68017411232
''
为'0'
,但是它将为任何数字添加前导0。
替代方案摘要:
n=42
assert "-101010" == format(-n, 'b')
assert "-101010" == "{0:b}".format(-n)
assert "-101010" == (lambda x: x >= 0 and str(bin(x))[2:] or "-" + str(bin(x))[3:])(-n)
assert "0b101010" == bin(n)
assert "101010" == bin(n)[2:] # But this won't work for negative numbers.
贡献者包括John Fouhy,Tung Nguyen,mVChr和Martin Thoma。和马丁·彼得斯(Martijn Pieters)。
str.format()
仅格式化一个值就太过分了。直接转到format()
函数:format(n, 'b')
。无需解析占位符并将其与参数匹配。
由于前面的答案大多使用format(),因此这是f字符串实现。
integer = 7
bit_count = 5
print(f'{integer:0{bit_count}b}')
输出:
00111
为方便起见,这里是格式化字符串文字的python docs链接:https : //docs.python.org/3/reference/lexical_analysis.html#f-strings。
>>> format(123, 'b')
'1111011'
使用numpy pack / unpackbits,它们是您最好的朋友。
Examples
--------
>>> a = np.array([[2], [7], [23]], dtype=np.uint8)
>>> a
array([[ 2],
[ 7],
[23]], dtype=uint8)
>>> b = np.unpackbits(a, axis=1)
>>> b
array([[0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8)
对于我们这些需要将带符号整数(范围-2 **(digits-1)到2 **(digits-1)-1)转换为2的补码二进制字符串的人来说,这可行:
def int2bin(integer, digits):
if integer >= 0:
return bin(integer)[2:].zfill(digits)
else:
return bin(2**digits + integer)[2:]
这将产生:
>>> int2bin(10, 8)
'00001010'
>>> int2bin(-10, 8)
'11110110'
>>> int2bin(-128, 8)
'10000000'
>>> int2bin(127, 8)
'01111111'
通过使用按位运算符,使用另一种算法的另一种解决方案。
def int2bin(val):
res=''
while val>0:
res += str(val&1)
val=val>>1 # val=val/2
return res[::-1] # reverse the string
更快的版本而无需反转字符串。
def int2bin(val):
res=''
while val>0:
res = chr((val&1) + 0x30) + res
val=val>>1
return res
numpy.binary_repr(num, width=None)
上面的文档链接中的示例:
>>> np.binary_repr(3) '11' >>> np.binary_repr(-3) '-11' >>> np.binary_repr(3, width=4) '0011'
当输入数字为负并且指定了宽度时,将返回二进制补码:
>>> np.binary_repr(-3, width=3) '101' >>> np.binary_repr(-3, width=5) '11101'
计算器,具有DEC,BIN,HEX的所有必要功能:(使用Python 3.5进行制造和测试)
您可以更改输入的测试编号并获得转换后的编号。
# CONVERTER: DEC / BIN / HEX
def dec2bin(d):
# dec -> bin
b = bin(d)
return b
def dec2hex(d):
# dec -> hex
h = hex(d)
return h
def bin2dec(b):
# bin -> dec
bin_numb="{0:b}".format(b)
d = eval(bin_numb)
return d,bin_numb
def bin2hex(b):
# bin -> hex
h = hex(b)
return h
def hex2dec(h):
# hex -> dec
d = int(h)
return d
def hex2bin(h):
# hex -> bin
b = bin(h)
return b
## TESTING NUMBERS
numb_dec = 99
numb_bin = 0b0111
numb_hex = 0xFF
## CALCULATIONS
res_dec2bin = dec2bin(numb_dec)
res_dec2hex = dec2hex(numb_dec)
res_bin2dec,bin_numb = bin2dec(numb_bin)
res_bin2hex = bin2hex(numb_bin)
res_hex2dec = hex2dec(numb_hex)
res_hex2bin = hex2bin(numb_hex)
## PRINTING
print('------- DECIMAL to BIN / HEX -------\n')
print('decimal:',numb_dec,'\nbin: ',res_dec2bin,'\nhex: ',res_dec2hex,'\n')
print('------- BINARY to DEC / HEX -------\n')
print('binary: ',bin_numb,'\ndec: ',numb_bin,'\nhex: ',res_bin2hex,'\n')
print('----- HEXADECIMAL to BIN / HEX -----\n')
print('hexadec:',hex(numb_hex),'\nbin: ',res_hex2bin,'\ndec: ',res_hex2dec,'\n')
要计算数字的二进制数:
print("Binary is {0:>08b}".format(16))
要计算数字的十六进制十进制:
print("Hexa Decimal is {0:>0x}".format(15))
要计算所有二进制数,直到16 ::
for i in range(17):
print("{0:>2}: binary is {0:>08b}".format(i))
计算十六进制小数,直到17
for i in range(17):
print("{0:>2}: Hexa Decimal is {0:>0x}".format(i))
##as 2 digit is enogh for hexa decimal representation of a number
这是我的回答,效果很好..!
def binary(value) :
binary_value = ''
while value !=1 :
binary_value += str(value%2)
value = value//2
return '1'+binary_value[::-1]
0
怎么办?例如,binary(0)
您会得到您所期望的吗?