关于python:采用表示十进制数的字符串并以二进制格式返回的函数

Function that takes a string representing a decimal number and returns it in binary format

我试图让一个函数取一个字符串dec,代表一个十进制数字,例如"11",我希望该函数返回一个字符串,其中包含相应的二进制格式,在本例中是"1011"。这就是我目前为止所拥有的:

1
2
3
4
5
6
7
def dec2bin(dec):

    dec = str("11")

    if dec > 1:
        binary(dec//2)
    return (dec % 2,end ="")

我对python非常陌生,所以我不知道如何首先将数字转换成字符串(使用str()),以及如何使它返回相应的二进制值。有人能给我指出正确的方向吗?


以下内容有效:

1
2
def dec2bin(dec):
    return format(int(dec),"b")

您可以这样测试它:

1
print dec2bin("11")


这应该有效:

1
2
def dec2bin(num):
    return bin(int(num))[2:]

int将字符串num转换为整数。bin将其转换为二进制表示(再次转换为字符串)。[2:]删除前两个字符,这只是二进制表示的一个指示符。


这是一个函数,它还允许您选择输出中的位数。

1
2
3
def int2bin(n, count=24):
   """returns the binary of integer n, using count number of digits"""
    return"".join([str((n >> y) & 1) for y in range(count-1, -1, -1)])

它通常需要一个int:

1
2
print int2bin(44)  
'000000000000000000101100'

但您可以先将字符串转换为int来使用它:

1
2
print int2bin(int("44"))  
'000000000000000000101100'

假设可以使用int将字符串转换为整数:

1
2
3
4
def dec2bin(snum):
    n = int(snum)
    bin_s = ['1' if (n >> b) & 1 else '0' for b in range(n.bit_length())]
    return ''.join(reversed(bin_s))

让我们来测试一下

1
2
>>> dec2bin('11')
'1011'

基本上,它扫描从字符串中获得的整数并检查其中的每一位。

它将数字右移并检查最低有效位,并将其与值1相加(或者,我们可以将掩码向左移动并保持数字不变)。

每个位检查的结果用于填充一个列表,然后将该列表反转并连接成一个字符串。

如果使用列表理解会使您看起来太酷而不真实,请使用for循环:

1
2
3
4
5
6
7
8
def dec2bin(snum):
    n = int(snum)
    bin_s = []
    for b in range(n.bit_length()):
        cur_bit = (n >> b) & 1
        sbit = chr(ord('0') + cur_bit)
        bin_s.append(sbit)
    return ''.join(reversed(bin_s))

如果您可以使用python的内置format函数,另一个解决方案是:

1
2
def dec2bin(snum):
    return format(int(snum),"b")

进一步说明算法(主要假设我们只讨论无符号整数):

计算机使用数据的二进制表示(即位、零和一)。一个接一个,从右到左,它们以2的升幂形成一个数字,就像十进制数字一样。

例如,数字13(13以10为基数表示:1*10^1+3*10^0)以二进制(1*2^3+1*2^2+0*2^1+1*2^0)写入1101,并以字节(8位)内的位存储在内存中。

LSB(最低有效位)是最不强大的位(二进制数字),即1101中最右边的位,因为它在2的幂方面最轻。

python允许整数的大小是可变的,这就是为什么我使用bit_length方法来找出存储这个数字需要多少位。其他语言(例如c)为数字分配一个预先定义的大小,通常与CPU提供的寄存器宽度相同(或更小)。