Yes, you can do 2's-complement multiplication.  I think you need to be 
more precise about what happens in case of overflow: are you just 
getting the low n bits of the 2n-bit result, which means that you have a 
meaningless sign bit; or is the high-order bit of the product preserved?

The way you do it in hardware (or microcode, often) is, you implement an 
nxn->2n-bit unsigned multiplier, then you correct the product by (for 
each operand) subtracting the operand IF the other operand is negative. 
  The math of this is fun to work through: in 2's-comp a positive number 
is 0.xxxx and a negative code 1.xxxx represents the number (1.xxxx - 2). 
  See what that means for products.

Cheap machines repeatedly add n-bit numbers together, which leads you to 
Booth's algorithm (q. v.).

Now that gates are free the multiplier is implemented with a network of 
full adders, which add 3 bits to produce a 2-bit total.  This network is 
called a carry-save adder, because the n^2 bits of the partial product 
are combined, using full adders, with no explicit carry propagation: you 
just keep adding bits of the same place value, reducing the number of 
bits by a 3:2 ratio, until you end up with 2n bits, which you then 
polish off with a carry-propagating adder (the art of design is in 
deciding which bits of equal value should be added).  The overall 
operation is surprisingly fast, much faster than adding 64 n-bit numbers 
one by one.  Research continues on the best way to build the carry-save 
adder, and the building blocks to use for it.

You could emulate any or all of that, but I'm not sure it's interesting 
to do so.

Henry Rich

On 12/10/2011 7:48 PM, Kip Murray wrote:
> Cool.  I think it is an improvement because it neatly avoids a case
> statement.  Now I wonder if we could implement two's-complement addition
> and multiplication with overflow, basing these on bitwise operations
>
>      0 + 0 is 0, 0 + 1 is 1 + 0 is 1, and 1 + 1 is 1 0
>
>      0 * 0 is 0 * 1 is 1 * 0 is 0, and 1*1 is 1
>
> That is, I do not want hc and hcinv to be used except to produce data
> and check answers, and I want n-bit two's-complement answers for n-bit
> two's-complement data so some of them will be wrong because of overflow.
>
> Here for Linda is Henry's hcinv expressed without conjunctions other
> than " .
>
>      hcinv =: ([: -/ [: #. (,: [: +: 1 {. ]))"1
>
> On 12/10/2011 10:00 AM, Henry Rich wrote:
>> Same idea, better implementation
>>
>>       hcinv =. -/@:#.@:(,: +:@(1&{.))"1
>>
>> Henry Rich
>>
>> On 12/10/2011 10:48 AM, Henry Rich wrote:
>>> Maybe not an improvement, but this is how I would have done back in my
>>> hardware-design days:
>>>
>>> hcinv =. -~/@:#.@:(~:/\)@:((,1)&,:)"1
>>>
>>> Quite a bit more elegant in wires than in J!
>>>
>>> Henry Rich
>>>
>>> On 12/10/2011 1:01 AM, Kip Murray wrote:
>>>> Now we need an inverse for Raul's improved #: ("hash colon")
>>>>
>>>>          hc  NB. Raul's improved #:
>>>>       {.@#:@(,: (2 * |))
>>>>
>>>>          hc i: 2
>>>>       1 1 0
>>>>       1 1 1
>>>>       0 0 0
>>>>       0 0 1
>>>>       0 1 0
>>>>
>>>>          hcinv  NB. improvement sought
>>>>       2&#.`(2&#.@}. - 2 ^<:@#)@.{."1
>>>>
>>>>          hcinv hc i: 2
>>>>       _2 _1 0 1 2
>>>>
>>>> On 12/8/2011 2:41 PM, Raul Miller wrote:
>>>> ...
>>>> But this would work just as well, as a model:
>>>>
>>>>          {.@#:@(,:  2 * |)i:2
>>>>       1 1 0
>>>>       1 1 1
>>>>       0 0 0
>>>>       0 0 1
>>>>       0 1 0
>>>> ----------------------------------------------------------------------
>>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>>>
>>> ----------------------------------------------------------------------
>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to