我正在尝试将基本程序转换为算术电路。我坚持将大于运算符转换为算术电路的步骤。具体来说,我不知道如何将以下内容转换为算术电路(输入x,y):
if x >= y:
return 1
else:
return 0
为了清楚起见,我需要能够用ARITHMETIC电路来表达这一点。这意味着我需要能够仅使用数字的加法和乘法(在Z_p中)进行计算。
我一直在网上搜索所有解决方案,但是我发现的所有内容都告诉我如何使用布尔电路做到这一点。我知道我可以将数字转换为它们的位字符串,然后执行这种布尔方式。我想知道执行此操作的任何其他方法。可以仅通过加法和乘法来完成此演示,但是我不知道该怎么做。
答案 0 :(得分:0)
如果对数据使用正确的编码,则不需要任何电路。 two's complement是编码符号整数最好和最广泛使用的方法。
正数由其二进制代码编码,负数A <0;由thinkig 2 ^ n- | A | = 2 ^ n + A变为正,其中n是代码中n的位数。
Two的补码具有(至少)两个主要优点。
第一个是它大大简化了算术运算。例如,由于负数A是由2 ^ n + A算术编码的,因此不必担心操作数的符号,只要忽略2 ^ n以上的位,并且添加有符号数就等于添加无符号数。 / p>
第二个优点是正数在0..2 ^(n-1)-1的范围内,并且始终未设置其最高有效位。负数的范围是-1 ..- 2 ^(n-1)。一旦加到2 ^ n,它们的代码范围就是2 ^(n-1).. 2 ^ n-1,并且对应于设置了最高有效位的数字。因此,要知道数字是否> = 0,只需测试其最高有效位。
因此,没有真正的“电路”或算术运算符可以做到这一点。在程序中,这可以通过使用MSB计算“与”来完成。
int is_positive(int x) { return (x & (1<<31)) == 0 ); }
没有与和,或或或比较的方法,就无法仅通过算术运算来表达它。而且,您必须有一种方法来检测数字是否完全为0,这需要逻辑门。