在Python中有任何罐装的Python方法将整数(或长)转换为二进制字符串吗?

谷歌上有无数的dec2bin()函数…但我希望我可以使用内置函数/库。


当前回答

与Yusuf Yazici的回答相似

def intToBin(n):
    if(n < 0):
        print "Sorry, invalid input."
    elif(n == 0):
        print n
    else:
        result = ""
        while(n != 0):
            result += str(n%2)
            n /= 2
        print result[::-1]

我调整了它,使唯一被改变的变量是结果(当然还有n)。

如果你需要在其他地方使用这个函数(即,让结果被另一个模块使用),考虑以下调整:

def intToBin(n):
    if(n < 0):
        return -1
    elif(n == 0):
        return str(n)
    else:
        result = ""
        while(n != 0):
            result += str(n%2)
            n //= 2            #added integer division
        return result[::-1]

因此-1将是表示转换失败的哨兵值。(这是假设您只转换正数,无论它们是整数还是长数)。

其他回答

如果你愿意放弃“纯”Python,但获得大量火力,这里有Sage -示例:

sage: a = 15
sage: a.binary()
'1111'

您将注意到它以字符串形式返回,因此要将它用作数字,您需要执行如下操作

sage: eval('0b'+b)
15

你可以这样做:

bin(10)[2:]

or :

f = str(bin(10))
c = []
c.append("".join(map(int, f[2:])))
print c

这是另一种算法的解决方案,使用位运算符。

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 

由于前面的答案大多使用format(), 这是一个f字符串的实现。

integer = 7
bit_count = 5
print(f'{integer:0{bit_count}b}')

输出:

00111

为了方便起见,这里有python文档中格式化字符串文字的链接:https://docs.python.org/3/reference/lexical_analysis.html#f-strings。

公认的答案没有涉及负数,我将会讲到。 除了上面的答案,你也可以只使用bin和十六进制函数。在相反的方向上,使用二进制符号:

>>> bin(37)
'0b100101'
>>> 0b100101
37

但是对于负数,事情就变得有点复杂了。这个问题没有具体说明你想如何处理负数。

Python只是添加了一个负号,所以-37的结果是这样的:

>>> bin(-37)
'-0b100101'

在计算机/硬件二进制数据中,不存在负号。我们只有1和0。因此,如果您正在读取或生成由其他软件/硬件处理的二进制数据流,您首先需要知道正在使用的符号。

一种表示法是符号幅度表示法,其中第一位表示负号,其余为实际值。在这种情况下,-37将是0b1100101, 37将是0b0100101。这看起来像python生成的结果,但只是在正数/负数前面添加了0或1。

更常见的是Two的补码表示法,它看起来更复杂,结果与python的字符串格式有很大不同。您可以在链接中阅读详细信息,但是使用8位有符号整数-37将是0b11011011, 37将是0b00100101。

Python没有简单的方法来生成这些二进制表示。你可以使用numpy将Two的补码二进制值转换为python整数:

>>> import numpy as np
>>> np.int8(0b11011011)
-37
>>> np.uint8(0b11011011)
219
>>> np.uint8(0b00100101)
37
>>> np.int8(0b00100101)
37

但我不知道一个简单的方法来做相反的内置函数。位串包可以提供帮助。

>>> from bitstring import BitArray
>>> arr = BitArray(int=-37, length=8)
>>> arr.uint
219
>>> arr.int
-37
>>> arr.bin
'11011011'
>>> BitArray(bin='11011011').int
-37
>>> BitArray(bin='11011011').uint
219