Linda, here are some utilities for working with signed binary numbers. 
Thanks to Don Guinn for a neat idea.  Kip

    NB. 32-"bit" signed binary numbers -- produced by verb sb

    NB. negative is - absolute value

    guinn =: * * (32#2) #: |  NB. Don Guinn, used in sb

    sb =: guinn`([: smoutput 'overflow!'"_)@.(4294967295 < |)"0

    ] 'a b' =: sb _5 3
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 _1 0 _1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  0 1  1

    sb 2^32
overflow!

    dv =: (2 p.~ |.)"1  NB. decimal value

    dv a ,: b
_5 3

    sh0 =: [: (''"_`0:@.(0=#) , ]) (}.~ 1 i.~ |)  NB. used in sh

    sh =: [: |."1 |.@sh0"1  NB. shorten by trimming leading zeros

    (sh a) ; (sh b)
+-------+---+
|_1 0 _1|1 1|
+-------+---+

    sh a ,: b
_1 0 _1
  0 1  1

    db =: [: sh sb  NB. display short form of binary

    db _5 3
_1 0 _1
  0 1  1

    add =: ([: sb +&dv)"1

    mul =: ([: sb *&dv)"1

    sh c =: a (add ,: mul) b
  0  0 _1  0
_1 _1 _1 _1

    dv c
_2 _15

    dv a ,: b
_5 3

    sub =: ([: sb -&dv)"1

    sh d =: a sub b
_1 0 0 0

    dv d
_8

    neg =: -@]"1

    sh a ,: b
_1 0 _1
  0 1  1

    sh neg a ,: b
1  0  1
0 _1 _1


I needed conjunctions!


On 12/27/2011 2:34 AM, Linda Alvord wrote:
> Here are my latest thoughts on negative binary numbers.
>
>     a=:1 0 0 1 1 0 1
>     #.a
> 77
>     b=:-a
>     b
> _1 0 0 _1 _1 0 _1
>     #.b
> _77
>
> The challenge is to get from  _77  to  _1 0 0 _1 _1 0 _1   which should be
> the result that  #:  provides. But that is not what happens:
>
>     #:#.b
> 0 1 1 0 0 1 1
>     #.#:#.b
> 51
>
> So here is a script which does that. It has lots of possibilities for
> simplification but it does give an idea of a possible approach. If someone
> can write the parts in loops or recursive style it would be interesting to
> compare results. I'm not a J programmer, but rather a J user who would like
> #:  to work.
> Have fun, share your ideas.
>
>
> ]n=:15
> NB.Number of places like 4 for a 4 digit number
> d=: 13 :'-?y#2'
> d
> ]dd=:d n
> NB.  d  creates an  n  digit negative binary number
> w=: 13 :'2^|.i.y'
> w
> w n
> NB. w  is a weighting list for each place value
> ]nd=:#.dd
> NB.  nd  converts a negative binary to a negative decimaldecimal number
> NB.nd=:_432532   insert a specific decimal to convert it
> ]p=:+/nd<-w 20
> ]b1=:-1=<.nd%-w n
> ]r1=:nd-#.b1
> ]b2=:-1=<.r1%-w n
> ]r2=:nd-#.b1+b2
> ]b3=:-1=<.r2%-w n
> ]r3=:nd-#.b1+b2+b3
> ]b4=:-1=<.r3%-w n
> ]r4=:nd-#.b1+b2+b3+b4
> ]b5=:-1=<.r4%-w n
> ]r5=:nd-#.b1+b2+b3+b4+b5
> ]b6=:-1=<.r5%-w n
> ]r6=:nd-#.b1+b2+b3+b4+b5+b6
> ]b7=:-1=<.r6%-w n
> ]r7=:nd-#.b1+b2+b3+b4+b5+b6+b7
> ]b8=:-1=<.r7%-w n
> ]r8=:nd-#.b1+b2+b3+b4+b5+b6+b7+b8
> ]b9=:-1=<.r8%-w n
> ]nb=:b1+b2+b3+b4+b5+b6+b7+b8+b9
> #.nb
> NB. nb has created the correct negative binary number
> ]dd
> #.dd
> ]p
> NB.nb id the binary created from a negative decimal number
> #:nd
> #.#:nd
> NB. results with problems
>
> Linda
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to