contribute by <yuan922
>
williamchangTW
小弟坐井觀天,如有冒犯請見諒"williamchangTW"
以三為基底的進位,其位數稱為三進位數(trit),使用0,1,2三個數表示。
P.S.二進位的位數稱為bit(binary digit的縮寫)。
相較於三進位用0,1,2表示,平衡三進位使用T(-1),0,1來表示數值,
這樣可以省去使用額外的負號表示負數。
\(1T1_{bal3}=1*3^2+(-1)*3^1+1*3^0\\ =7\)
\(T1T_{bal3}=(-1)*3^2+1*3^1+(-1)*3^0\\ =-7\)
用3來除看看:
\(\begin{split}\ 2356/3&=785...1\\ 785/3&=262...T\\ 262/3&=87...1\\ 87/3&=29...0\\ 29/3&=10...T\\ 10/3&=3...1\\ 3/3&=1...0\\ 1/3&=0...1\\ 由下往上寫回去:101T01T1 \end{split}\)
一般除法是要除出一個餘數(不夠的數),而這裡因為只用-1,0,1來表示,
所以要產生-1就要乘上一個會超過被除數的數字
e.g. 785/3=262…T 原本應該會是261…2
e.g. 29/3=10…T 原本應該會是9…2
\(\begin{split}\ 整數部分:-22\\ -22/3&= -7\dfrac{1}{3} 最接近整數為-7...-1\\ -7/3&=-2\dfrac{1}{3} 最接近整數為-2...-1\\ -2/3&=-\dfrac{2}{3} 最接近整數為-1...1\\\ -1/3&=-\dfrac{1}{3} 最接近整數為0...-1\\ \end{split}\)
\(\begin{split}\ 小數部分:-0.4\\ -0.4*3&=-1.2 圓整為-1... -0.2\\ -0.2*3&=-0.6 圓整為-1... 0.4\\ 0.4*3&=1.2圓整為1... 0.2\\ 0.2*3&=0.6圓整為1...-0.4,循環\\ \end{split}\)
AND(Min取小):有T的都會是T,因為最小
∧ | T | 0 | 1 |
---|---|---|---|
T | T | T | T |
0 | T | 0 | 0 |
1 | T | 0 | 1 |
OR(Max取大):有1的都會是1,因為最大 | |||
∨ | T | 0 | 1 |
–––– | –––– | –––– | –––– |
T | T | 0 | 1 |
0 | 0 | 0 | 1 |
1 | 1 | 1 | 1 |
XOR (a ⊕ b) = ( (a ∧ – b) ∨ (b ∧ – a) ) | |||
⊕ | T | 0 | 1 |
–––– | –––– | –––– | –––– |
T | T | 0 | 1 |
0 | 0 | 0 | 0 |
1 | 1 | 0 | T |
先以logic table觀察Sum跟Carry的結果:
Sum | – | 0 | + |
---|---|---|---|
– | + | – | 0 |
0 | – | 0 | + |
+ | 0 | + | – |
Carry | – | 0 | + |
---|---|---|---|
– | – | 0 | 0 |
0 | 0 | 0 | 0 |
+ | 0 | 0 | + |
紅字解釋:
(-1)+(-1)=-2在\(bal_3\)會用(-3)+1表示也就是\(T1\)
(+1)+(+1)=2在\(bal_3\)會用3+(-1)表示也就是\(1T\)
這我想好久…
yuan922
Balanced ternary half adder
(a ⊠ b):a,b同時為-則-,同時為+則+,其餘皆0。
for (r = 0; r < SZD; ++r) {
p = &digit[r];
p->exp = r ? (3 * digit[r-1].exp) : 1;
p->val = 0;
}
從第3行的判斷式來看,因為r一開始是0,所以一定會跳到後面的結果,
也就是說 p->exp=1;而 p = &digit[0],
那麼 digit[0].exp 就會是1。
為了方便觀察 exp 的變化,用 printf 印出變化:
for (r = 0; r < SZD; ++r) {
p = &digit[r];
printf("exp_before %d \n",p->exp);
p->exp = r ? (3 * digit[r-1].exp) : 1;
printf("exp_after %d\n",p->exp);
p->val = 0;
}
可以看出exp就是不斷的*3,以\(3^n\)變化。
p = &digit[SZD - 1];
r = 3 * p->exp / 2;
if (src > r)
src = r;
else
r = src;
r=3*2184/2=3280.5,所以如果輸入大於r就只能最多到r。
do {
while (r < p->exp)
--p;
r -= p->exp;
++p->val;
} while (r);
拿r=15為例:一開始進去迴圈會先不斷的遞減p直到r超過一個最近的值,
以15來說就會從2187一直遞減到9,之後15-9=6,
p->exp=9的val+1,再來6會對應到3,6-3=3,
p->exp=3的val+1,再來3也會對應到3,3-3=0,
p->exp=3的val再+1,跳出迴圈。
while (p < &digit[SZD]) {
if (r)
++p->val;
r = p->val > 1;
if (r)
p->val -= 3;
p->val *= inv;
++p;
}
這段是轉換成 \(bal_3\)的形式:
or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing