Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何对二进制文件求和?从二进制幂向量表示到真正的二进制表示,如何实现?_Python_Math_Syntax_Binary - Fatal编程技术网

Python:如何对二进制文件求和?从二进制幂向量表示到真正的二进制表示,如何实现?

Python:如何对二进制文件求和?从二进制幂向量表示到真正的二进制表示,如何实现?,python,math,syntax,binary,Python,Math,Syntax,Binary,我试图将一个二进制数表示为实数的列表,如(1,3,6)表示0b100101。首先,我尝试将它们求和为2^1+2^3+2^6,然后转换为二进制 with open('DATA.txt') as f: for line in f: myLine=line.rstrip().split("\t") print [bin(2**int(l)) for l in myLine[1:5]] 我把它转换成下面的列表 >>> a=['0

我试图将一个二进制数表示为实数的列表,如(1,3,6)表示
0b100101
。首先,我尝试将它们求和为2^1+2^3+2^6,然后转换为二进制

with open('DATA.txt') as f:
    for line in f:
            myLine=line.rstrip().split("\t")
            print [bin(2**int(l)) for l in myLine[1:5]]
我把它转换成下面的列表

>>> a=['0b10000000000000000000000000', '0b100000000000', '0b100000000000000000000000000000']
>>> a[1]|a[2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for |: 'str' and 'str'
>>> bin(a[1])+bin(a[2])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an index
预期输出

['0b10000000000000000000000000', '0b100000000000', '0b100000000000000000000000000000']
0b100010000000000000100000000000
内置函数返回的值是一个简单字符串。它不是一个“二进制数”。二进制数不存在,只有二进制表示的数。Python整数在内部表示为base-2,
bin
函数允许将此表示(实际上是模数和符号表示,而不是二的补码)表示为字符串

如果要对这些字符串执行逐位操作,如
|
,则必须将它们转换为整数,然后再转换回字符串:

In [7]: bin(int('0b10000', 2)|int('0b100', 2))
Out[7]: '0b10100'
如果给定一个二进制字符串列表,您希望获得一个组合这些字符串的数字,则可以使用该函数:

In [8]: import operator as op

In [9]: from functools import reduce

In [10]: a = ['0b10000000000000000000000000', '0b100000000000', '0b100000000000000000000000000000']

In [13]: bin(reduce(op.or_, (int(num, 2) for num in a)))
Out[13]: '0b100010000000000000100000000000'
内置函数返回的值是一个简单字符串。它不是一个“二进制数”。二进制数不存在,只有二进制表示的数。Python整数在内部表示为base-2,
bin
函数允许将此表示(实际上是模数和符号表示,而不是二的补码)表示为字符串

如果要对这些字符串执行逐位操作,如
|
,则必须将它们转换为整数,然后再转换回字符串:

In [7]: bin(int('0b10000', 2)|int('0b100', 2))
Out[7]: '0b10100'
如果给定一个二进制字符串列表,您希望获得一个组合这些字符串的数字,则可以使用该函数:

In [8]: import operator as op

In [9]: from functools import reduce

In [10]: a = ['0b10000000000000000000000000', '0b100000000000', '0b100000000000000000000000000000']

In [13]: bin(reduce(op.or_, (int(num, 2) for num in a)))
Out[13]: '0b100010000000000000100000000000'

巴库留很好地解释了发生的事情,所以我会简短地说。你问题的解决办法是

with open('DATA.txt') as f:
    for line in f:
        myLine=line.rstrip().split("\t")
        print sum(2**int(l) for l in myLine[1:5])

请注意,只要只设置了不同的位,求和就等于二进制或二进制,我假设这里就是这种情况。

Bakuriu很好地解释了发生了什么,所以我将简短地讲一下。你问题的解决办法是

with open('DATA.txt') as f:
    for line in f:
        myLine=line.rstrip().split("\t")
        print sum(2**int(l) for l in myLine[1:5])

请注意,求和等于二进制,或者,只要只设置了不同的位,我假设这里就是这种情况。

我得到不同长度的二进制数,是否可以得到特定长度(如10 int长)的每个数?例如:“0b10 0b1100 0b100100 0b11000”以便“0b00010 0b001100 0b100100 0b011000”在前面填充额外的零?someStringBinary.zfill(30)几乎就是这样工作的。
“0b”+bin(20)[2:]zfill(10)
我得到了不同长度的二进制数,是否可以得到特定长度的每个数,例如10 int长?例如:“0b10 0b1100 0b100100 0b11000”以便“0b00010 0b001100 0b100100 0b011000”在前面填充额外的零?someStringBinary.zfill(30)的工作原理几乎就是这样。
“0b”+bin(20)[2:].zfill(10)