当前位置:  开发笔记 > 编程语言 > 正文

Python int到二进制?

如何解决《Pythonint到二进制?》经验,为你挑选了11个好方法。

是否有任何固定的Python方法可以将Integer(或Long)转换为Python中的二进制字符串?

Google上有无数的dec2bin()函数......但我希望我可以使用内置的函数/库.



1> Tung Nguyen..:

Python的字符串格式方法可以采用格式规范.

>>> "{0:b}".format(37)
'100101'

格式化Python 2的规范文档

格式化Python 3的规范文档


`str.format()`只是格式化一个值是过度的.直接进入[`format()`函数](https://docs.python.org/2/library/functions.html#format):`format(n,'b')`.无需解析占位符并将其与参数匹配,直接进行值格式化操作本身.如果需要将格式化结果放在更长的字符串中(例如将其用作模板),则只使用`str.format()`.
@mike:或者使用格式规范.将带有"0"的数字位数添加到格式化字符串中:`format(10,'016b')`格式化为带有前导零的16位数字.
谢谢董.什么是扭转这种操作的pythonic方法?

2> John Fouhy..:

如果你正在寻找bin()相同的hex(),它是在python 2.6中添加的.

例:

>>> bin(10)
'0b1010'


另请注意,执行`str(bin(i))[2:]`(对于1000000ops为0.369s)比"{0:b}"更快.format(i)`(对于1000000ops为0.721s)
@mVChr如果有人将数字转换为ASCII二进制表示,我真的希望速度无关紧要.
@mVChr:`str.format()`无论如何都是错误的工具,你可以使用`format(i,'b')`代替.考虑到这也为您提供了填充和对齐选项; `format(i,'016b')`格式化为16位零填充二进制数.要用`bin()做同样的事情,你必须添加一个`str.zfill()`调用:`bin(i)[2:].zfill(16)`(不需要调用`str() `!).`format()`的可读性和灵活性(动态格式化更难以使用`bin()`)是很好的权衡,除非必须,否则不要优化性能,直到那时为可维护性进行优化.
当然,在python 3.6及更高版本中,您现在可以使用`f“ {37:b}”`。

3> paxdiablo..:

Python实际上确实已经内置了一些内容,能够执行诸如的操作'{0:b}'.format(42),这将为您提供位模式(在字符串中)42,或101010.


对于更一般的哲学,任何语言或图书馆都不会为其用户群提供他们想要的一切.如果您在一个无法提供所需内容的环境中工作,那么您应该在开发时收集代码片段,以确保您不必再编写两次相同的内容.例如:

def int_to_bin_string(i):
    if i == 0:
        return "0"
    s = ''
    while i:
        if i & 1 == 1:
            s = "1" + s
        else:
            s = "0" + s
        i //= 2
    return s

假设Python还没有更简单的方法,它将根据十进制值构造二进制字符串.

一般的想法是使用代码(按优先顺序):

语言或内置库.

具有合适许可证的第三方库.

你自己的收藏.

您需要编写的新内容(并保存在您自己的集合中以供日后使用).



4> 小智..:

作为参考:

def toBinary(n):
    return ''.join(str(1 & int(n) >> i) for i in range(64)[::-1])

此函数可以转换一个大的正整数18446744073709551615,表示为字符串'1111111111111111111111111111111111111111111111111111111111111111'.

它可以被修改为提供更大的整数,但它可能不像"{0:b}".format()或更方便bin().


有了Python的旧版本,这正是我所需要的,谢谢。

5> Martin Thoma..:

如果你想要一个没有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(整数,'b')`.`bin()`是一个调试工具,专门用于生成*Python二进制整数文字语法*,`format()`用于生成特定格式.
更多替代方案:如果要使宽度动态化,而不是`str.zfill()`,可以使用带有动态第二个参数的`str.format()`或`format()`:`'{0:0 {1} b}'.format(x,n)`或`format(b,'0 {} b'.format(n))`.
从文档中:*结果是有效的Python表达式*。目的是产生一个Python表达式,而不是产生最终用户表示。oct()和hex()也一样。

6> Aziz Alto..:

带有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



7> Xiang..:

一种简单的方法是使用字符串格式,请参阅此页面.

>> "{0:b}".format(10)
'1010'

如果你想拥有一个固定长度的二进制字符串,你可以使用这个:

>> "{0:{fill}8b}".format(10, fill='0')
'00001010'

如果需要两个补码,则可以使用以下行:

'{0:{fill}{width}b}'.format((x + 2**n) % 2**n, fill='0', width=n)

其中n是二进制字符串的宽度.



8> Bob Stein..:

替代方案摘要:

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')`.无需解析占位符并将其与参数匹配.

9> grepit..:

这是针对python 3的,它保持前导零!

print(format(0, '08b'))



10> pitfall..:

使用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)



11> John Forbes..:

由于前面的答案大多使用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。

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有