使用自然数(或整数)运算以算术方式定义的 XOR
XOR arithmetically defined with operations for natural numbers (or integers)
我正在查看其他帖子以找到 XOR 的算术方法并找到 this,但无法应用于 python3 中的 自然数。
琐碎的方法:
a = 12
b = 5
a^b ===> 9
使用其他帖子的公式:
a = 12
b = 5
a + b - a*b*(1 + a + b - (a*b)) ===> 2537
另一个选项:
a = 12
b = 5
(a-b)**2 ===> 49
当然,如果 a 和 b 为零或一,前面所有的方法都可以正常工作,就像其他帖子所说的那样,但是...
有没有函数可以用更算术的方式与自然数进行异或运算?
更新:
使用响应代码,我以更数学的方式构建了算术公式,只是让问题和答案更加清晰。谢谢!
首先,我们必须确定“算术”的定义。大英百科全书说它是“数学分支,其中研究数字、数字之间的关系以及对数字的观察并用于解决问题”。
根据这些基本规则,除了通常的 +-*/
之外,以下规则也是合法的:
- 整数除法
- 模(除法的余数)
- 最大和比较(数字之间的关系)
可以利用这些进行算术“位移”。
以下符合给定条件:
# By the problem statement, we're dealing with Natural numbers (Z+). No need to check for negatives.
def numBits(x):
acc = 0
while x > 0:
x //= 2
acc += 1
return acc
def xor(a, b):
acc = 0
pos = 1
for i in range(numBits(max(a, b))):
acc += ((a + b) % 2) * pos
a //= 2
b //= 2
pos *= 2
return acc
# Prints 9
print(xor(12, 5))
“算术”可以包括求幂和对数以节省一些输入,但我将其保留为更基本的运算。
如果您正在寻找更单一的公式,如果您事先知道数字的位宽 n,则可以将上述循环展开为 n 项之和:
def xor(a, b):
return ((a + b) % 2) + ((a // 2 + b // 2) % 2) * 2 + ... + ((a // 2 ** n + b // 2 ** n) % 2) * 2 ** n
我正在查看其他帖子以找到 XOR 的算术方法并找到 this,但无法应用于 python3 中的 自然数。
琐碎的方法:
a = 12
b = 5
a^b ===> 9
使用其他帖子的公式:
a = 12
b = 5
a + b - a*b*(1 + a + b - (a*b)) ===> 2537
另一个选项:
a = 12
b = 5
(a-b)**2 ===> 49
当然,如果 a 和 b 为零或一,前面所有的方法都可以正常工作,就像其他帖子所说的那样,但是...
有没有函数可以用更算术的方式与自然数进行异或运算?
更新: 使用响应代码,我以更数学的方式构建了算术公式,只是让问题和答案更加清晰。谢谢!
首先,我们必须确定“算术”的定义。大英百科全书说它是“数学分支,其中研究数字、数字之间的关系以及对数字的观察并用于解决问题”。
根据这些基本规则,除了通常的 +-*/
之外,以下规则也是合法的:
- 整数除法
- 模(除法的余数)
- 最大和比较(数字之间的关系)
可以利用这些进行算术“位移”。
以下符合给定条件:
# By the problem statement, we're dealing with Natural numbers (Z+). No need to check for negatives.
def numBits(x):
acc = 0
while x > 0:
x //= 2
acc += 1
return acc
def xor(a, b):
acc = 0
pos = 1
for i in range(numBits(max(a, b))):
acc += ((a + b) % 2) * pos
a //= 2
b //= 2
pos *= 2
return acc
# Prints 9
print(xor(12, 5))
“算术”可以包括求幂和对数以节省一些输入,但我将其保留为更基本的运算。
如果您正在寻找更单一的公式,如果您事先知道数字的位宽 n,则可以将上述循环展开为 n 项之和:
def xor(a, b):
return ((a + b) % 2) + ((a // 2 + b // 2) % 2) * 2 + ... + ((a // 2 ** n + b // 2 ** n) % 2) * 2 ** n