【问题标题】:How to build a comparison operator (comparitor) in an arithmetic circuit如何在算术电路中构建比较运算符(比较器)
【发布时间】:2019-11-07 12:33:29
【问题描述】:

我正在尝试将基本程序转换为算术电路。我被困在将大于运算符转换为算术电路的步骤上。具体来说,我不知道如何将以下内容转换为算术电路(输入x,y):

if x >= y: return 1 else: return 0

为了清楚起见,我需要能够用算术电路来表达这一点。这意味着我需要能够仅使用数字的加法和乘法(在 Z_p 中)来计算它。

我一直在网上搜索解决方案,但我找到的所有内容都告诉我如何使用布尔电路来做到这一点。我知道我可以将数字转换为它们的位字符串并执行这种布尔方式。我想知道任何替代方法来做到这一点。这个节目可以只用加法和乘法,但我不知道怎么做。

【问题讨论】:

    标签: math logic arithmetic-expressions integer-arithmetic circuit


    【解决方案1】:

    如果您对数据使用正确的编码,则不需要任何电路。最好和最广泛使用的有符号整数编码是two's complement
    正数由它们的二进制代码编码,负数 A<0;通过考虑 2^n-|A|=2^n+A 将其呈现为正,其中 n 是代码 n 的位数。

    补码有(至少)两个主要优点。
    第一个是它在很大程度上简化了算术运算。例如,由于负数 A 由 2^n+A 算术编码,因此不必关心操作数的符号,只要忽略超过 2^n 的位,并且添加有符号数与添加无符号数相同。

    第二个优点是正数在 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,这需要逻辑门。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 2023-03-26
      • 2021-01-13
      • 2019-08-13
      相关资源
      最近更新 更多