我有一个base2值列表(每个5位数):
[10000, 10001, 10010, 10011, 10100, 10101, 10110, 10111, 11000, 11001, 11010, 11011, 11100, 11101, 11110, 11111]
有没有办法在base2中用它们进行数学运算?例如,10001 + 1110 = 11111
10000 - 1 = 1111
。
答案 0 :(得分:4)
默认情况下,您编写的任何数字都以10为基数。因此,当您键入10000
时,实际上您编写的数字数万。
如果您想指定以二进制编写数字,请使用0b
前缀。
>>> 0b10000
16
如果由于任何原因无法更新代码以添加上述前缀,则可以使用此辅助函数将十进制表示法转换为二进制值。
def decimal_notation_to_binary(x):
return int(str(x), 2)
示例:
>>> decimal_notation_to_binary(10000)
16
或者,如果您想要的是数字的二进制表示,请使用bin
内置函数。
>>> bin(42)
'0b101010'
对于算术,二进制数和十进制数之间的差异只是Python在屏幕上写入的方式,在内存中所有整数都存储为二进制。这意味着你可以用二进制给出的数字算术,就像你对任何数字一样。
>>> 0b10000 + 0b1000
24
事实上,作为您输入数字的基础无关的证据,您甚至可以添加二进制,十进制和十六进制数字。
>>> 0b100 + 0x1f + 7
42
答案 1 :(得分:1)
@Naji ,请看下面的代码示例。
您可以多次使用 int()和 bin()功能来满足您的目标。
a = 10000
b = 1
# Base 2 addition
result1 = (bin( int(str(a), 2) - int(str(b), 2) )[2:] # 1111
# Base 2 subtraction
result2 = bin( int(str(a), 2) + int(str(b), 2) )[2:] # 10001
>>> # Base 2 subtraction & addition
...
>>> a = 10000
>>> b = 1
>>>
>>> result = bin( int(str(a), 2) - int(str(b), 2) )
>>> result
'0b1111'
>>>
>>> result = bin( int(str(a), 2) + int(str(b), 2) )
>>> result
'0b10001'
>>>
>>> result = bin( int(str(a), 2) - int(str(b), 2) )[2:]
>>> result
'1111'
>>>
>>> result = bin( int(str(a), 2) + int(str(b), 2) )[2:]
>>> result
'10001'
>>>
让我们尝试添加您在问题中指定的所有二进制数。
>>> binaries = [10000, 10001, 10010, 10011, 10100, 10101, 10110, 10111, 11000, 11001, 11010, 11011, 11100, 11101, 11110, 11111]
>>>
>>> decimals = [int(str(binary), 2) for binary in binaries]
>>> decimals
[16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]
>>>
>>> sum(decimals)
376
>>>
>>> bin(sum(decimals))
'0b101111000'
>>>
>>> bin(sum(decimals))[2:]
'101111000'
>>>
最后,我们可以设计我们自己的函数,它会在加法或减法后产生精确的双边字符串(即0b
前面没有0b1111
)。
# ********* BASE2 ADDITION ***************
def base2_addition(a, b):
try:
int_a = int(str(a), 2)
int_b = int(str(b), 2)
return bin(int_a + int_b)[2:]
except:
print ("Invalid input provided (Expected 2 binary strings/numbers with 0s and 1s")
return None
print base2_addition('10000', '1') # 10001
print base2_addition('10001', '011') # 10100
# ********* BASE2 SUBTRACTION **************
def base2_subtraction(a, b):
try:
int_a = int(str(a), 2)
int_b = int(str(b), 2)
return bin(int_a - int_b)[2:]
except:
print ("Invalid input provided (Expected 2 binary strings/numbers with 0s and 1s")
return None
print(base2_subtraction('10100', '101')) # 1111
答案 2 :(得分:0)
您可以转换为int,执行操作,然后转换回二进制 例如:
print(bin(int(' 1001',base = 2)+ int(' 1011',base = 2))[2:])
答案 3 :(得分:0)
您正在使用的数字是基数10表示。您可以使用0b
作为前缀,使其成为基础2 0b10001 + 0b1110
,等于31
(0b11111
)。
答案 4 :(得分:0)
假设您希望将这些int
数字视为二进制数字,首先需要将它们转换为二进制数字:
In []:
lst = [10000, 10001, 10010, 10011, 10100, 10101, 10110, 10111, 11000, 11001, 11010, 11011, 11100, 11101, 11110, 11111]
blst = [int(str(n), 2) for n in lst]
print(blst)
Out[]:
[16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]
int
的默认设置是打印基数10,因此基数为10 0b10000
为16
。
即使使用二进制文字,例如:
In []:
[0b10000, 0b10001, 0b10010, 0b10011, 0b10100, 0b10101]
Out[]:
[16, 17, 18, 19, 20, 21]
您可以将它们打印为二进制文件:
In []:
print(' '.join(format(n, 'b') for n in blst))
Out[]:
10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111
您可以添加和删除这些值,只要您以二进制格式打印出来,它就会如您所愿,例如从所有这些中减去0b1
:
In []:
print(' '.join(format(n - 0b1, 'b') for n in blst))
Out[]:
1111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110
并添加0b1110
:
In []:
print(' '.join(format(n + 0b1110, 'b') for n in blst))
Out[]:
11110 11111 100000 100001 100010 100011 100100 100101 100110 100111 101000 101001 101010 101011 101100 101101
答案 5 :(得分:0)
根据{
"boundingBox": [
2,
52,
65,
46,
69,
89,
7,
95
],
"text": "dog",
.
.
.
文档字符串,需要int
或int
数据类型
long
而Docstring:
int(x=0) -> int or long
int(x, base=10) -> int or long
需要bin
:
str
由于您的列表属于Docstring:
bin(number) -> string
而不是base10
,因此它不是最漂亮也不是最快,我会将您的base2
列表转换为base10
通过铸造输入并进行数学计算。
既然你提到你只关心减法或加法,我加了变量X来控制你的减法或加法。
注意:我认为此处的变量X采用base2
格式化的base2
或string
,因此您只需提供{{{ 1}}或int
值。如果输入任何大于或等于2的数字,它会抛出X = '1000'
异常,例如:X = 1000
或ValueError
X = 1112
根据您要自动执行的操作,要完成的代码会有所不同。