∇R←DECODE N
R←2⊥N
∇
∇R←X ENCODE N
R←(X⍴2)⊤N
∇
∇R←ENCODE32 N
R←(32⍴2)⊤N
∇
∇R←ENCODE64 N
R←(64⍴2)⊤N
∇
⍝ example
⎕←A←ENCODE64 865940890845960854
0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 1 1 0 1 1 1 1 1 0 1 1
0 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0
DECODE A
8.659408908E17 ⍝ GG
正常情況下都会这么用 loop 写吧
∇R←A ADD B;C
⍝ BINARY ADDITION
→NOTEST/BEGIN
DERR∧/(A=A=1)∧B=B=1
BEGIN:
⍝ RESET OVERFLOW
OVERFLOW←0
LOOP:A←A+B
⍝ FIND CARRY
C←2=A
→(0=+/C)/END
A[C/⍳⍴C]←0
⍝ CHECK OVERFLOW
OVERFLOW←OVERFLOW∨1=''⍴C
B←(⍴C)↑1↓C
→LOOP
END:
R←A
∇
说白了就是进位法。
不过发现了一个规律沒有
A←1 0 0 1 0 1 1 0 1 1 1 0 1 1 1 1
B←1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 1
A+B
2 0 1 1 1 2 1 0 1 1 2 0 1 1 1 2
A ADD B
0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0
单个的 “2” 会变成 “10”,“12” 变成 “100”,“1112” 会变成 “10000”,“22” 则是 “110”。
这样看來根本不用 loop 麻。
C
1 0 0 1 1 2 0 2 0 1 1 1 2
1 1 0 1 0 0 1 1 1 1 0 0 0⊂C
┌─┬───┬─────┬─┬─┬─┬───────┐
│1│0 0│1 1 2│0│2│0│1 1 1 2│
└─┴───┴─────┴─┴─┴─┴───────┘
Z←C>0
Z
1 0 0 1 1 1 0 1 0 1 1 1 1
(1⌽Z)-Z
¯1 0 1 0 0 ¯1 1 ¯1 1 0 0 0 0
(¯1⌽Z)-Z
0 1 0 ¯1 0 0 1 ¯1 1 ¯1 0 0 0
|(¯1⌽Z)-Z
0 1 0 1 0 0 1 1 1 1 0 0 0
1,1↓|(¯1⌽Z)-Z
1 1 0 1 0 0 1 1 1 1 0 0 0
(1,1↓|(¯1⌽Z)-Z)⊂C
┌─┬───┬─────┬─┬─┬─┬───────┐
│1│0 0│1 1 2│0│2│0│1 1 1 2│
└─┴───┴─────┴─┴─┴─┴───────┘
⌽¨(1,1↓|(¯1⌽Z)-Z)⊂C
┌─┬───┬─────┬─┬─┬─┬───────┐
│1│0 0│2 1 1│0│2│0│2 1 1 1│
└─┴───┴─────┴─┴─┴─┴───────┘
A ADD B
1 0 1 0 0 0 1 0 1 0 0 0 0
⊃¨⌽¨(1,1↓|(¯1⌽Z)-Z)⊂C
1 0 2 0 2 0 2
2=⊃¨⌽¨(1,1↓|(¯1⌽Z)-Z)⊂C
0 0 1 0 1 0 1
K←⌽¨(1,1↓|(¯1⌽Z)-Z)⊂C
2=⊃¨K
0 0 1 0 1 0 1
(2=⊃¨K)/K
┌─────┬─┬───────┐
│2 1 1│2│2 1 1 1│
└─────┴─┴───────┘
{(⍴⍵)⍴0}¨(2=⊃¨K)/K
┌─────┬─┬───────┐
│0 0 0│0│0 0 0 0│
└─────┴─┴───────┘
Z←{(⍴⍵)⍴0}¨(2=⊃¨K)/K
Z
┌─────┬─┬───────┐
│0 0 0│0│0 0 0 0│
└─────┴─┴───────┘
K
┌─┬───┬─────┬─┬─┬─┬───────┐
│1│0 0│2 1 1│0│2│0│2 1 1 1│
└─┴───┴─────┴─┴─┴─┴───────┘
K[⍸2=⊃¨K]←Z
K
┌─┬───┬─────┬─┬─┬─┬───────┐
│1│0 0│0 0 0│0│0│0│0 0 0 0│
└─┴───┴─────┴─┴─┴─┴───────┘
∊K
1 0 0 0 0 0 0 0 0 0 0 0 0
于是有 version1
∇R←A ADDK B;C;B;T;K
C←A+B
N←C>0
K←⌽¨(1,1↓|(¯1⌽N)-N)⊂C
T←2=⊃¨K
K[⍸T]←{(⍴⍵)⍴0}¨T/K
T←(⍴T)↑1↓T
K[⍸T]←{1,((⍴⍵)-1)⍴0}¨T/K
K←∊⌽¨K
R←K
∇
试一试
A ADDK B
1 0 1 0 0 0 1 0 1 0 0 0 0 ⍝ seems ok
1 1 1 ADDK 1 1 1
0 0 0
GG, WTF?
A←B ← 1 1 1
A+B
2 2 2
C←A+B
K←⌽¨(1,1↓|(¯1⌽N)-N←C>0)⊂C
K
┌─────┐
│2 2 2│
└─────┘
額⋯⋯
说明 2 要額外做 partition。
那么干脆就一开始先 reverse 好了
于是最后版本
∇R←A ADD B;C;N;I
C←⌽A+B
N←C>0
R←((C=2)∨1,1↓|(¯1⌽N)-N)⊂C ⍝ Partition
I←2=⊃¨R ⍝ Find pattern "1*2"
R[⍸I]←{(⍴⍵)⍴0}¨I/R ⍝ substitution
OVERFLOW←''⍴⌽I
I←(-⍴I)↑¯1↓I ⍝ carry
R[⍸I]←{1,((⍴⍵)-1)⍴0}¨I/R
R←⌽∊R
∇
试试
1 1 1 ADD 1 1 1
1 1 0
OVERFLOW
1
∇