Let us add 1 1 0 and 0 1 0 in a simple-minded way working from right to 
left, and writing carries above the addition:

  1 1 0     <-- these are carries
    1 1 0
    0 1 0
    -----
  1 0 0 0

If we keep only the right three bits in our answer we get 0 0 0 .  For 
this reason in two's-complement notation 1 1 0 represents _2 -- because 
when you "add" it to 0 1 0 you get 0 0 0 (because of keeping only three 
bits in the answer).  For the same reason 1 1 1 represents _1 in two's 
complement notation: when you "add" it to 0 0 1 you get 0 0 0 .

Below hcinv finds the two's-compliment values of the three-bit numbers.

On 12/10/2011 8:23 PM, Linda Alvord wrote:
> I just finished posting my thoughts on this and found your function Henry.
>
>      hcinv =: ([: -/ [: #. (,: [: +: 1 {. ]))"1
>     d
> 1 1 0
> 1 1 1
> 0 0 0
> 0 0 1
> 0 1 0
>
>     hcinv d
> _2 _1 0 1 2
>
> This shouldn't be  _2 _1 0 1 2   because  d  really is  6 7 0 1 2
>
>    ]c
> _1 1  0
>   0 0 _1
>   0 0  0
>   0 1 _1
>   0 1  0
>
>     2 2 2#.c
> _2 _1 0 1 2
>
> Base seems happy with negative numbers but #: is not so happy.
>
> Linda
>
> -----Original Message-----
> From: programming-boun...@jsoftware.com
> [mailto:programming-boun...@jsoftware.com] On Behalf Of Kip Murray
> Sent: Saturday, December 10, 2011 7:48 PM
> To: Programming forum
> Subject: Re: [Jprogramming] How #: should have been designed
>
> 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
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to