Напевно, я витратив більше часу на це питання, ніж повинен був, але ось мої висновки.
Я не можу знайти жодного прикладу "чистого" паралельного додавача префіксів для негабінарних чисел. Я також вважаю , що це відкрита проблема, так як я не бачив ніяких доказів того, що це не можливо.
Найближче, що я можу отримати вас, - це використання двоступеневого негативного додавання негативу (в літературі зазвичай скорочено nnba). Він заснований на такому властивості:
Нехай і . Це в основному виключає операція з і відповідно. Потім ви можете це довести g ( x ) = x n - 1 ¯ x n - 2 . . . x 1 ¯ x 0f( x ) = xn - 1¯¯¯¯¯¯¯¯¯¯хn - 2. . . х1¯¯¯¯¯х0г( x ) = xn - 1хn - 2¯¯¯¯¯¯¯¯¯¯. . . х1х0¯¯¯¯¯0xAA...AA
0x55...55
- ( а +n bб ) = г( f( а ) + f( b ) + 1 )
Там, де ліва сторона є негабінарною сумою , тоді як на правій стороні - нормальна двійкова сума.+n b+
Від'ємну суму потім можна просто перевернути, використовуючи ту саму властивість, але з нульовим операндом:
- x = g( f( х ) + f( 0 ) + 1 )
Отже, щоб знайти суму за допомогою паралельних додавачів префікса, ви можете:
- Обчислити і , тобто. шляхом перетворення кожного непарного біта негабінарних чиселf( а )f( b )
- Обчисліть звичайну двійкову суму, встановивши біт перенесення для LSB ( ), що веде до першої посередницької суми .+ 1с1
- Інвертувати всі біти (це ). Це закінчення першої суми, при цьому також починається інверсія.с1f( g( с1) )
- Збільшити результат на
0xAA...AB
( ), використовуючи паралельний суфікс префікса, даючи другу суму посередника= f( 0 ) + 1с2
- Обчисліть (перевернувши кожен парний біт), щоб знайти остаточну мінубінарну суму.г( с2)
Насправді я намагався знайти "чисту" паралельну приставку префікса, але вважав це занадто складним для того часу, який я був готовий витратити на це. Ось чому:
Вся суть паралельних суфіксів префікса полягає у пошуку деякої операції що дозволяє легко обчислити (у цьому випадку 2) несе з цих бітів. Як додаткове обмеження, операція повинна бути асоціативною для обчислення паралельно. Наприклад, це в основному виключає жодного оператора NOT (що не є частиною подвійного заперечення). Наприклад: - не асоціативний оператор, оскільки{ 0 , 1 }н× { 0 , 1 }н→ { 0 , 1 }нa ∘ b = a ⋅ b¯
( a ∘ b ) ∘ ca ∘ ( b ∘ c )= a ⋅ b¯⋅ c¯= a ⋅ b ⋅ c¯¯¯¯¯¯¯¯¯¯
Зауважте, що булевий оператор для ваших запитань включає змішані терміни і , що робить неможливим його використання як є. Для одиночного перенесення в звичайному бінарному додаванні стало цілком очевидно, як побудувати цього оператора, думаючи про нього з точки зору генерації та розповсюдження , але це здається не таким очевидним для негабінарних переносів.c+ic-i¯¯¯¯¯c-ic+i¯¯¯¯¯