contributed by<zhanyangch
>
sysprog2017
TODO: 詳細閱讀 Fast Ternary Addition,理解 base-3 的原理 (並且複習數位邏輯),整理 base-3 基礎運算操作
"jserv"
williamchangTW
小弟坐井觀天,如有冒犯請見諒"williamchangTW"
Ternary 以三為底,每個 ternary digit(trit) 有三個符號表示 0,1,2 ,Balanced Ternary 則是 +,0,- 或 1,0,T,一個無號整數 N,可以用 log3(N+1)(無條件進位) 位三進位表示,與二進位需要 log2(N+1) 相比,三進位只須 log3N/log2N(0.63) 倍的位數,除了用來代表數字以外,也對應的 Kleene logic
truth value | unsigned | balanced |
---|---|---|
false(F) | 0 | - |
unknown(U) | 1 | 0 |
true(T) | 2 | + |
Kleene logic 運算,參考 Three-valued logic(wikipedia) | ||
NOT(A):¬A | ||
A | ¬A | |
- | – | |
F | T | |
U | U | |
T | F | |
AND(A,B):A∧B | ||
A\B | F | U |
:-: | :-: | :-: |
F | F | F |
U | F | U |
T | F | U |
OR(A,B):A∨B | ||
A\B | F | U |
:-: | :-: | :-: |
F | F | U |
U | U | U |
T | T | T |
$ git clone https://github.com/sysprog21/balanced-ternary
$ cd balanced-ternary
$ make
作業要求頁面已更新,請注意。重新
git clone
並依據裡頭的程式碼,對下方程式碼做對應的縮排 (4 個空白,而不是 tab)
"jserv"以修正
"zhanyangch"
p = &digit[SZD - 1];
r = 3 * p->exp / 2;
if (src > r)
src = r;
else
r = src;
++p->val
的運算順序是 ++(p->val)
// Like 'echo "obase=3; $src" | bc'.
do {
while (r < p->exp)
--p;
r -= p->exp;
++p->val;
} while (r);
for(p = &digit[SZD-1]; p >= &digit[0]; --p)
printf("%d",p->val);
printf("\n");
$ echo 25 | ./b3k
00000221
├───┐
│ │
└┴┬─┘
例如:
// Convert to the balanced form.
while (p < &digit[SZD]) {
if (r)
++p->val;
r = p->val > 1;
if (r)
p->val -= 3;
p->val *= inv;
++p;
}
請閱讀 Ternary computing: basics,關注於 ternary multiplexer, Unary functions, half-adder, Consensus, full adder, Overflow
"jserv
B | -1 | 0 | 1 |
---|---|---|---|
S | A-1 | A | A+1 |
A+B
A\B | -1 | 0 | 1 |
---|---|---|---|
-1 | 1 | -1 | 0 |
0 | -1 | 0 | 1 |
1 | 0 | 1 | -1 |
B | -1 | 0 | 1 |
---|---|---|---|
C | min(A,0) | 0 | max(A,0) |
Image Not Showing
Possible Reasons
|
(A-1)+B
B | -1 | 0 | 1 |
---|---|---|---|
A+B-1 | A+1 | A-1 | A |
(A+1)+B | |||
B | -1 | 0 | 1 |
:-: | :-: | :-: | :-: |
A+B+1 | A | A+1 | A-1 |