【Python】Python十进制转二进制,可指定位数

# convert a decimal (denary, base 10) integer to a binary string (base 2)
# tested with Python24   vegaseat    6/1/2005

def Denary2Binary(n):
    '''convert denary integer n to binary string bStr'''
    bStr = ''
    if n < 0:  raise ValueError, "must be a positive integer"
    if n == 0: return '0'
    while n > 0:
        bStr = str(n % 2) + bStr
        n = n >> 1
    return bStr

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)])

# this test runs when used as a standalone program, but not as an imported module
# let's say you save this module as den2bin.py and use it in another program
# when you import den2bin the __name__ namespace would now be  den2bin  and the
# test would be ignored
if __name__ == '__main__':
    print Denary2Binary(255)  # 11111111
    
    # convert back to test it
    print int(Denary2Binary(255), 2)  # 255
    
    print
    
    # this version formats the binary
    print int2bin(255, 12)  # 000011111111
    # test it
    print int("000011111111", 2)  # 255
    
    print

    # check the exceptions
    print Denary2Binary(0)
    print Denary2Binary(-5)  # should give a ValueError
#该代码片段来自于: http://www.sharejs.com/codes/python/5746


<think>好的,用户的问题是关于如何在Python中将十进制数组换为二进制数组。我需要结合提供的引用和已有的知识来给出有效的解决方案。首先,用户提到的引用中有几个相关的点需要注意: 引用[1]中提到了将二进制数组换为十进制的方法,比如使用字符串拼接然后整数。这可能对逆过程有帮助,比如拆分十进制数为二进制字符串。 引用[4]中的LeetCode题目展示了如何将链表中的二进制换为十进制,其中使用了字符串拼接和int换。反过来,可能需要将十进制数分解为二进制字符串。 用户可能需要将每个十进制换为二进制表示的字符串或数组。例如,数字5换为二进制是'101',可能需要存储为['1','0','1']或者数组形式[1,0,1]。 接下来,我需要考虑不同的实现方法: 1. **使用内置函数bin()**:每个十进制数可以用bin()函数换为二进制字符串,然后去掉前缀'0b',再分割成单个字符。例如,bin(5)得到'0b101',处理后变成'101',然后为列表。但需要注意处理负数的情况,不过用户的问题可能只涉及非负数数组。 2. **使用numpy库**:如果用户处理的是numpy数组,可能需要向量化操作。引用[2]提到numpy的数组操作,可以利用np.vectorize或np.binary_repr函数来处理每个元素。 3. **固定位数的问题**:用户可能需要保持二进制数的位数一致,比如统一为8位,这时需要使用zfill()或者格式化字符串来补零。例如,5换为8位二进制是'00000101'。 4. **数据类型换**:换后的二进制数组元素可能需要是整数类型还是字符串类型。根据引用[3],Python中的类型换需要注意,比如将字符换为int。 现在需要综合考虑这些因素,给出不同的方法。例如: 方法一:使用列表推导式和bin()函数,处理每个元素,去除前缀,分割字符,并为整数列表。 方法二:利用numpy的vectorize函数,将整个数组换为二进制字符串数组,再处理每个字符串为字符列表。 方法三:处理固定位数的情况,使用格式化字符串确保每个二进制数的位数相同,如使用format(num, '08b')。 此外,需要考虑效率问题,特别是对于大数组,numpy的方法可能更高效。同时,用户是否需要处理负数?如果不需要,可以假设数组中的数字都是非负的。 根据引用[4]中的方法,将数值为字符串再处理,这可能适用于单个数字的处理。类似地,可以将每个十进制二进制字符串,再拆分成数组元素。 可能的代码示例: 对于列表推导式方法: decimal_array = [5, 3, 9] binary_array = [list(format(num, '08b')) for num in decimal_array] 或者换为整数列表: binary_array = [[int(bit) for bit in format(num, '08b')] for num in decimal_array] 如果不需要固定位数,可以使用bin(num)[2:]来获取二进制字符串,然后用zfill补充前导零到一定长度。 对于numpy数组,可以使用np.vectorize来应用format函数,然后拆分成字符数组: import numpy as np decimal_arr = np.array([5, 3, 9]) binary_strs = np.vectorize(lambda x: format(x, '08b'))(decimal_arr) binary_arr = np.array([list(s) for s in binary_strs]).astype(int) 这样得到的binary_arr会是二维数组,每行对应一个十进制数的二进制位。 需要注意的是,如果十进制数较大,所需的位数可能超过预设的位数,比如使用8位可能导致溢出,因此可能需要根据数组中的最大值确定位数。例如,计算最大值的二进制长度,然后动态设置位数。 总结步骤: 1. 确定每个二进制数的位数(固定或根据最大值动态计算)。 2. 对每个十进制换为二进制字符串,补足前导零。 3. 将字符串拆分为单个字符并换为整数类型。 4. 组合所有结果为一个二维数组。 同时,需要考虑用户是否需要保留前导零,以及输出类型是字符串还是整数数组。根据引用中的例子,用户可能倾向于使用字符串处理,如引用[1]中将数组换为字符串再十进制,逆过程类似。 现在需要将这些思路整理成清晰的步骤,并提供代码示例,确保语法正确,使用中文回答,并生成相关问题。</think>在Python中将十进制数组换为二进制数组可通过以下步骤实现,提供三种常用方法: ### 方法一:列表推导式+字符串格式化(固定位数) $$n_{binary} = \lfloor \log_2(n_{decimal}) \rfloor + 1$$ ```python decimal_list = [5, 3, 9] bit_length = max(x.bit_length() for x in decimal_list) # 动态计算位数 binary_list = [[int(b) for b in format(num, f'0{bit_length}b')] for num in decimal_list] # 结果:[[1,0,1], [0,1,1], [1,0,0,1]] ``` ### 方法二:numpy向量化操作 $$A_{binary} = f_{vectorize}(A_{decimal})$$ ```python import numpy as np decimal_arr = np.array([5, 3, 9]) binary_strs = np.vectorize(lambda x: np.binary_repr(x, width=8))(decimal_arr) binary_arr = np.array([list(s) for s in binary_strs]).astype(np.uint8) # 结果:[[0,0,0,0,0,1,0,1], [0,0,0,0,0,0,1,1], ...] ``` ### 方法三:位运算生成器 $$b_k = \lfloor \frac{n}{2^k} \rfloor \mod 2$$ ```python def decimal_to_binary(num, bits=8): return [(num >> i) & 1 for i in reversed(range(bits))] decimal_list = [5, 3, 9] binary_list = [decimal_to_binary(x) for x in decimal_list] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值