たぶん、私はこの質問に思っているよりも多くの時間を費やしたでしょうが、ここに私の発見があります。
負数の「純粋な」並列プレフィックス加算器の例は見つかりません。また、それが可能でないという証拠を見たことがないので、それは未解決の問題だと思います。
最も近い方法は、2段階のネガティブネガバイナリ加算を使用することです(通常、文献ではnnbaと省略されます)。次のプロパティに基づいています。
f(x)=xn−1¯¯¯¯¯¯¯¯¯¯xn−2...x1¯¯¯¯¯x0g(x)=xn−1xn−2¯¯¯¯¯¯¯¯¯¯...x1x0¯¯¯¯¯0xAA...AA
0x55...55
−(a+nbb)=g(f(a)+f(b)+1)
+nb+
負の合計は、同じプロパティを使用して、オペランドがゼロの場合に単純に反転できます。
−x=g(f(x)+f(0)+1)
したがって、並列プレフィックス加算器を使用して合計を見つけるには、次のことができます。
- f(a)f(b)
- +1s1
- s1 fです(g(s1)))。これは最初の合計の終了であり、同時に反転も開始します。
- 結果を
0xAA...AB
(= f(0 )+ 1)並列プレフィックス加算器を使用して、2番目の中間和を生成します s2
- 計算する g(s2) (各偶数ビットを反転して)最終的なネガバイナリの合計を見つけます。
私は実際に「純粋な」並列プレフィックス加算器を見つけようとしましたが、私はそれを費やすつもりだった時間のためには複雑すぎると考えました。その理由は次のとおりです。
並列プレフィックス加算器のポイントは、次の操作を見つけることです。 { 0 、1 }n× { 0 、1 }n→ { 0 、1 }nこれにより、これらのビットからキャリー(この場合は2)を簡単に計算できます。追加された制約として、演算は、並列で計算されるために連想的である必要があります。たとえば、これは基本的にNOT演算子(二重否定の一部ではない)を除外します。例えば:a∘b=a⋅b¯ is not an associative operator, because
(a∘b)∘ca∘(b∘c)=a⋅b¯⋅c¯=a⋅b⋅c¯¯¯¯¯¯¯¯¯¯
Note that the boolean operator for the carries in your question includes the mixed terms c+ic−i¯¯¯¯¯ and c−ic+i¯¯¯¯¯, making it impossible to use it as-is. For a single carry in normal binary addition, it became quite obvious how to construct this operator when thinking about it in terms of generation and propagation, but it seems to be not so obvious for negabinary carries.