Python:如何按位将 4 位数字的数组转换为更大的数字?
Python: How to convert array of 4 digits to a larger number, bitwise?
假设我有
array = [1,2,3,4]
我想要的是NOT转换为数字1234;但是要取 1、2、3 和 4 的位,将它们连接起来并转换回数字。
换句话说,我可能不得不将每个 number/digit 转换为二进制,将它们连接起来,然后再转换回数字。
因此,1,2,3,4 将分别为 00000001
、00000010
、00000011
、00000100
。连接它们将导致 00000001000000100000001100000100
转换为无符号整数将是 16909060
请记住,数组中的数字来自 ord(characters)
,因此它们的长度应为 8 位,因此连接后应产生 32 位数字
我该怎么做?
如有必要,在 Python 中操作字节数组的常用方法是使用 struct module. Beware of the byte order。
Python 3
>>> import struct
>>> i, = struct.unpack("<i", bytes([1, 2, 3, 4]))
>>> i
67305985
>>>
Python 2 & 3
>>> import struct
>>> i, = struct.unpack("<i", struct.pack("4B", *[1, 2, 3, 4]))
>>> i
67305985
>>>
sum([v << i * 8 for i, v in enumerate(reversed(array))])
在这个简单的例子中,也许这就足够了:
result = array[0] << 24 | array[1] << 16 | array[2] << 8 | array[3]
例如:
array = [1, 2, 3, 4]
result = array[0] << 24 | array[1] << 16 | array[2] << 8 | array[3]
print result
打印这个:
16909060
array = [1,2,3,4]
new = []
for number in array:
bits = bin(number).split('b')[1]
#transform your number into a binary number (like 0b001), transforms that binary into an array split at b, so [0, 001] and takes the second number of that.
while len(bits) < 8:
bits = '0' + bits
#turns the newly created binary number into an 8 number one
new.append(bits)
output = '0b'
for item in new:
output += item
#puts all the binary's together to form a new, 32 bit binary
output = int(output, 2)
#turns the binary string an integer
为此使用字符串可能不是最干净的方法,但它确实有效。
如果你喜欢一条线
>>> int("".join([bin(x)[2:].zfill(8) for x in a]),2)
16909060
还是按部就班
第一步.将数字转换为二进制字符串,excape 0b
s
>>> a = [1,2,3,4]
>>> b = [bin(x)[2:] for x in a]
>>> b
['1', '10', '11', '100']
步骤 2. 用零填充元素 (zfill)
>>> c = [i.zfill(8) for i in b]
>>> c
['00000001', '00000010', '00000011', '00000100']
第 3 步。连接元素以创建新字符串
>>> d = "".join(c)
>>> d
'00000001000000100000001100000100'
第四步.转换为10基数
>>> int(d,2)
16909060
假设我有
array = [1,2,3,4]
我想要的是NOT转换为数字1234;但是要取 1、2、3 和 4 的位,将它们连接起来并转换回数字。
换句话说,我可能不得不将每个 number/digit 转换为二进制,将它们连接起来,然后再转换回数字。
因此,1,2,3,4 将分别为 00000001
、00000010
、00000011
、00000100
。连接它们将导致 00000001000000100000001100000100
转换为无符号整数将是 16909060
请记住,数组中的数字来自 ord(characters)
,因此它们的长度应为 8 位,因此连接后应产生 32 位数字
我该怎么做?
如有必要,在 Python 中操作字节数组的常用方法是使用 struct module. Beware of the byte order。
Python 3
>>> import struct
>>> i, = struct.unpack("<i", bytes([1, 2, 3, 4]))
>>> i
67305985
>>>
Python 2 & 3
>>> import struct
>>> i, = struct.unpack("<i", struct.pack("4B", *[1, 2, 3, 4]))
>>> i
67305985
>>>
sum([v << i * 8 for i, v in enumerate(reversed(array))])
在这个简单的例子中,也许这就足够了:
result = array[0] << 24 | array[1] << 16 | array[2] << 8 | array[3]
例如:
array = [1, 2, 3, 4]
result = array[0] << 24 | array[1] << 16 | array[2] << 8 | array[3]
print result
打印这个:
16909060
array = [1,2,3,4]
new = []
for number in array:
bits = bin(number).split('b')[1]
#transform your number into a binary number (like 0b001), transforms that binary into an array split at b, so [0, 001] and takes the second number of that.
while len(bits) < 8:
bits = '0' + bits
#turns the newly created binary number into an 8 number one
new.append(bits)
output = '0b'
for item in new:
output += item
#puts all the binary's together to form a new, 32 bit binary
output = int(output, 2)
#turns the binary string an integer
为此使用字符串可能不是最干净的方法,但它确实有效。
如果你喜欢一条线
>>> int("".join([bin(x)[2:].zfill(8) for x in a]),2)
16909060
还是按部就班
第一步.将数字转换为二进制字符串,excape 0b
s
>>> a = [1,2,3,4]
>>> b = [bin(x)[2:] for x in a]
>>> b
['1', '10', '11', '100']
步骤 2. 用零填充元素 (zfill)
>>> c = [i.zfill(8) for i in b]
>>> c
['00000001', '00000010', '00000011', '00000100']
第 3 步。连接元素以创建新字符串
>>> d = "".join(c)
>>> d
'00000001000000100000001100000100'
第四步.转换为10基数
>>> int(d,2)
16909060