使用Python将十进制转换为二进制

194

在Python中,有没有可以将十进制数转换为二进制的模块或函数呢?我知道可以使用int('[binary_value]',2)将二进制转换为十进制,但是否有任何方法可以避免自己编写代码进行反向转换呢?


1
与“转换为二进制字符串”的链接问题不同,我认为这个问题是不同的。我来到这里是想将一个整数转换为相应的二进制数组(或布尔数组),我认为这将是一个合理的答案。 - Sanjay Manohar
1
@SanjayManohar 这里找到的纯字符串处理算法(https://stackoverflow.com/a/60693697/8929814)可以被改编成你想要的功能。 - CopyPasteIt
8个回答

289

所有数字都是以二进制形式存储。如果您想要一个给定数字的文本表示形式,请使用bin(i)

>>> bin(10)
'0b1010'
>>> 0b1010
10

9
误导性。bin() 返回的是二进制字符串,而不是二进制数。 - hiperbolt
@hiperbolt 可以使用一个非误导性解决方案的链接。 - Gulzar

84

1
我得到了以下错误:TypeError: 非空格式字符串传递给object.__format__ - Right leg
1
我也遇到了同样的问题,使用Python 3.5.2版本。 TypeError: non-empty format string passed to object.format啊,现在我明白你的意思了:---> '101111' - Josef Klotzner
2
你也可以确定以这种方式表示的位数:>>> "{:0>15b}".format(3) >>> '000000000000011' - MissSergeivna
可以使用format(int_value, 'b') - Arye P.
1
解决方案不正确,值小于0。 - duyetpt

83
"{0:#b}".format(my_int)

49
打印带前导零的格式为:"{0:08b}".format(my_int),其中my_int是要打印的整数。 - Waldo Bronchart
@WaldoBronchart 非常酷。你能给我解释一下,在前导零的情况下它是如何工作的吗?这是内置的,在使用0 + 8或0 + 16时可以获得前导零吗? - Alexandre Allegro

54
def dec_to_bin(x):
    return int(bin(x)[2:])

如此简单。


17
不要返回整数-1。同时,dec_to_bin(-1)会出现ValueError: invalid literal for int() with base 10: 'b1'的错误提示。 - Eric
2
你能解释一下 [2:] 的含义吗? - Patrick Ferreira
2
尝试使用bin(2)。你不会得到'10',而是得到'0b10'。同样的问题也可能出现在hex(2)中('0x2')。因此,你需要去掉前两个字符。你可以使用切片来从第三个字符开始截取。 - leewz
1
@zero_cool如果 test_var = "Hello world" 那么 test_var[2:] = "llo world" - Walter
4
@Wallace:因为二进制和十进制只是数字显示的一种选择,而不是数字本身的一部分。dec_to_bin(0b101) == 101这个说法是无意义的,因为你可以对101进行的任何操作都与原始的5没有任何关系,例如,dec_to_bin(0b101) + 1 == 102 - Eric
显示剩余2条评论

20
您也可以使用numpy模块中的函数。
from numpy import binary_repr

它还可以处理前导零:

Definition:     binary_repr(num, width=None)
Docstring:
    Return the binary representation of the input number as a string.

    This is equivalent to using base_repr with base 2, but about 25x
    faster.

    For negative numbers, if width is not given, a - sign is added to the
    front. If width is given, the two's complement of the number is
    returned, with respect to that width.

13

我同意@aaronasterling的答案。然而,如果你想要一个非二进制字符串,可以将其转换为int类型,那么你可以使用规范算法:

def decToBin(n):
    if n==0: return ''
    else:
        return decToBin(n/2) + str(n%2)

int(bin(10), 2) 的结果是 10int(decToBin(10)) 的结果是 101,而 int(decToBin(10), 2) 的结果是 5。此外,如果使用 from __future__ import division 或者 Python 3,你的函数会达到递归限制。 - aaronasterling
5
@aaron,后面的问题可以通过切换到“//”(截断除法)来解决;前面的问题可以通过在“return”语句中交换两个字符串相加的顺序来解决。无论如何,在这里递归没有任何意义(bin(n)[2:]——或者如果您卡在某个旧版本的Python上,则使用while循环会更好!)。 - Alex Martelli
1
这太棒了!它也可以用 lambda 方式实现 :] binary = lambda n: '' if n==0 else binary(n/2) + str(n%2) - Aziz Alto
@AzizAlto 我得到了一大堆带有许多e-的数字,还有在递归调用dectobin中。 - Timo
2
@Timo 哈哈,显然你正在使用Python3,只需将binary(n/2)更改为binary(n//2),那么你就不会遇到这个问题了 :-) - Aziz Alto
我认为最好使用if n==0: return '0'而不是if n==0: return '',因为对于n=0,你的代码返回空字符串,这是错误的答案。虽然这种方法会在非零输入的左侧给你一个额外的0。 - user3342981

8
n=int(input('please enter the no. in decimal format: '))
x=n
k=[]
while (n>0):
    a=int(float(n%2))
    k.append(a)
    n=(n-a)/2
k.append(0)
string=""
for j in k[::-1]:
    string=string+str(j)
print('The binary no. for %d is %s'%(x, string))

2
为了完整起见:如果你想将定点表示转换为其二进制等效形式,可以执行以下操作:
  1. Get the integer and fractional part.

    from decimal import *
    a = Decimal(3.625)
    a_split = (int(a//1),a%1)
    
  2. Convert the fractional part in its binary representation. To achieve this multiply successively by 2.

    fr = a_split[1]
    str(int(fr*2)) + str(int(2*(fr*2)%1)) + ...
    
你可以在这里阅读解释:这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接