不使用内置的bin函数将整数转换为二进制

13

这个函数接收一个整数参数,并应该返回一个表示相同值的二进制位列表,其中列表中的第一个元素是最高位(最左边的位)。

我的函数当前对于数字11输出'1011',而我需要得到[1,0,1,1]

例如:

>>> convert_to_binary(11)
[1,0,1,1]

1
你能否请发一下你目前的代码?这听起来像是一项作业任务,发布代码将有助于我们更好地帮助你。 - GWW
每次在描述中发布代码时,我都会收到一个错误消息。 - user1790201
@user1790201,请点击编辑按钮,这是您应该发布代码的地方。 - John
@user1790201:听起来你想要询问反转函数。你可以提出一个单独的问题,而不是将其添加到现有的问题中。 - Dietrich Epp
16个回答

19
def trans(x):
    if x == 0: return [0]
    bit = []
    while x:
        bit.append(x % 2)
        x >>= 1
    return bit[::-1]

12

只是为了好玩 - 将解决方案作为递归单行代码:

def tobin(x):
    return tobin(x/2) + [x%2] if x > 1 else [x]

@DietrichEpp 嗯,边角案例。已经修复了,感谢您指出。 - Óscar López
4
在Python3中,对于输入x >= 9,该代码会失败。为了修复它:将返回语句更改为''' return tobinr(x//2) + [x%2] if x > 1 else [x] ''',这样可以使代码正确运行。 - sirgogo
在Python 3中仍然有一些奇怪的工作方式。 - hola

8
我可以提出以下建议:
def tobin(x,s):
    return [(x>>k)&1 for k in range(0,s)]

我认为这可能是最快的方式,对于技术来说似乎很清晰。 当性能很重要时,二进制方式太慢了。

干杯


3
请问"x"和"s"是什么? - gwthm.in
@user1811468,你的解决方案很好,但是列表需要反转才能得到正确的答案。我已经编辑了你的代码。 - theQuestionMan
1
@7H3IN5ID3R x是十进制值,s是您想用它表示的位数 - 我已更改变量名称以使其更具描述性。 - theQuestionMan

2

你可以先使用 format 函数来获取一个像你当前函数一样的二进制字符串。例如,以下代码片段创建一个对应于整数58的8位二进制字符串。

>>>u = format(58, "08b")
'00111010'

现在迭代字符串,并将每个位转换为int以获得所需的整数编码的位列表。
>>>[int(d) for d in u]
[0, 0, 1, 1, 1, 0, 1, 0]

1
这绝对是这里最好的方法。谢谢! - Charles Clayton

1
你可以使用numpy包来获得非常快的解决方案:
python -m timeit -s "import numpy as np; x=np.array([8], dtype=np.uint8)" "np.unpackbits(x)"
1000000 loops, best of 3: 0.65 usec per loop

python -m timeit "[int(x) for x in list('{0:0b}'.format(8))]"
100000 loops, best of 3: 3.68 usec per loop

unpackbits仅处理uint8类型的输入,但您仍然可以使用np.view:

python -m timeit -s "import numpy as np; x=np.array([124567], dtype=np.uint64).view(np.uint8)" "np.unpackbits(x)"
1000000 loops, best of 3: 0.697 usec per loop

0

填充长度

在大多数情况下,您希望二进制数具有特定的长度。例如,您希望数字1具有8个二进制位[0,0,0,0,0,0,0,1]。我自己也使用这种方法:

def convert_to_binary(num, length=8):
    binary_string_list = list(format(num, '0{}b'.format(length)))
    return [int(digit) for digit in binary_string_list]

0
将十进制转换为二进制取决于如何使用 % 和 // 运算符。
def getbin(num):
    if (num==0):
        k=[0] 
        return k 
    else:
        s = []
        while(num):
            s.append(num%2)
            num=num//2
        return s

虽然这是一个技术上的新脚本,但这个概念以前已经被其他答案使用过。请阅读 如何撰写好的答案? - Mr. T

0

这样做就可以了。如果有内置函数,那么自己编写一个函数就没有意义了。

def binary(x):
    return [int(i) for i in bin(x)[2:]]

bin() 函数将数据转换为二进制字符串。去掉开头的 0b 即可。


5
我认为他试图不使用bin函数来完成它。 - John
2
我不能使用二进制函数来处理这个问题,也不能使用任何导入。 - user1790201
2
@johnthexiii: 自然而然地,如果您不告诉他们指示,就无法保证某人会遵循指示。 - Dietrich Epp
1
@johnthexiii:当我读到这个时,我不知道“out bin”是什么意思。我把它当作文章中的另一个错误而忽略了它。 - Dietrich Epp
3
你们对这个答案大惊小怪的,其实上方已经有一个完全可行的答案了。@johnthexiii,在这里没有顾客。我会把这个答案留在这里,以防除了提问者之外的其他人也会发现它有用,我认为这种可能性并不小。 - Dietrich Epp
显示剩余4条评论

0

虽然不是最有效的方法,但至少它提供了一种简单的概念方式来理解它...

1)将所有数字重复地除以2,直到达到1

2)按相反的顺序,创建这个数字数组的位,如果它是偶数,则附加0,如果是奇数,则附加1。

以下是该方法的文字实现:

def intToBin(n):
    nums = [n]
    while n > 1:
        n = n // 2
        nums.append(n)

    bits = []
    for i in nums:
        bits.append(str(0 if i%2 == 0 else 1))
    bits.reverse()
    print ''.join(bits)

这里有一个更好地利用内存的版本:

def intToBin(n):
    bits = []

    bits.append(str(0 if n%2 == 0 else 1))
    while n > 1:
        n = n // 2
        bits.append(str(0 if n%2 == 0 else 1))

    bits.reverse()
    return ''.join(bits)

0
def nToKBit(n, K=64):
   output = [0]*K

   def loop(n, i):
       if n == 0: 
           return output
       output[-i] = n & 1
       return loop(n >> 1, i+1)

   return loop(n, 1)

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