这个函数接收一个整数参数,并应该返回一个表示相同值的二进制位列表,其中列表中的第一个元素是最高位(最左边的位)。
我的函数当前对于数字11输出'1011'
,而我需要得到[1,0,1,1]
。
例如:
>>> convert_to_binary(11)
[1,0,1,1]
这个函数接收一个整数参数,并应该返回一个表示相同值的二进制位列表,其中列表中的第一个元素是最高位(最左边的位)。
我的函数当前对于数字11输出'1011'
,而我需要得到[1,0,1,1]
。
例如:
>>> convert_to_binary(11)
[1,0,1,1]
def trans(x):
if x == 0: return [0]
bit = []
while x:
bit.append(x % 2)
x >>= 1
return bit[::-1]
只是为了好玩 - 将解决方案作为递归单行代码:
def tobin(x):
return tobin(x/2) + [x%2] if x > 1 else [x]
def tobin(x,s):
return [(x>>k)&1 for k in range(0,s)]
我认为这可能是最快的方式,对于技术来说似乎很清晰。 当性能很重要时,二进制方式太慢了。
干杯
你可以先使用 format 函数来获取一个像你当前函数一样的二进制字符串。例如,以下代码片段创建一个对应于整数58的8位二进制字符串。
>>>u = format(58, "08b")
'00111010'
>>>[int(d) for d in u]
[0, 0, 1, 1, 1, 0, 1, 0]
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
在大多数情况下,您希望二进制数具有特定的长度。例如,您希望数字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]
def getbin(num):
if (num==0):
k=[0]
return k
else:
s = []
while(num):
s.append(num%2)
num=num//2
return s
这样做就可以了。如果有内置函数,那么自己编写一个函数就没有意义了。
def binary(x):
return [int(i) for i in bin(x)[2:]]
bin()
函数将数据转换为二进制字符串。去掉开头的 0b
即可。
bin
函数来完成它。 - John虽然不是最有效的方法,但至少它提供了一种简单的概念方式来理解它...
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)
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)