他是各位數的加減法器
減法我是用二的補數做的
9+9=18
8-4=4
1-7=-6這個出不來請問要怎麼設計,請各位高手指點一下方向感激阿@@!!
2007-01-06 20:13:11 · 1 個解答 · 發問者 黑 1 in 電腦與網際網路 ➔ 程式設計
其實我不懂c 沒有學過,我現在上的事數位邏輯設計不過我想因該原理差不多吧,你可以告訴我原理嘛??
2007-01-07 05:29:28 · update #1
我好樣有想到了,謝謝!!!
2007-01-07 14:44:54 · update #2
#include
#include
#define DIG 4
#define MAX 16 // power(2, DIG)
void print(char *d)
{ for (int i=DIG; i>=0; i--) printf("%c", d[i]|'0');
printf(" ");
}
char *i2b(int i, char *d) // Non-Negative Integer to Binary
{ int j;
for (j=0; i ; j++) { d[j] = i & 1, i >>= 1; }
for ( ; j<=DIG; j++) d[j] = 0;
return d;
}
int b2i(char *d) // Binary to Integer
{ int i, j;
for (i=0, j=DIG-1; j>=0; j--)
{ i <<= 1;
if (d[j]) i++;
}
if (d[DIG]) i -= MAX;
return i;
}
char *comp(char *d) // 1補數
{ for (int i=0; i<=DIG; i++) d[i] = !d[i];
return d;
}
char *comp2(char *d) // 2補數
{ comp(d);
for (int i=0; i<=DIG; i++)
{ if (d[i]) d[i] = 0;
else { d[i] = 1; break; }
}
return d;
}
int c, o;
char *add(char *a, char *b)
{ int i;
static char s[DIG+1];
for (o=c=i=0; i<=DIG; i++)
{ s[i] = a[i] + b[i] + c;
if (s[i]>1) c = 1, s[i] -= 2;
else c = 0;
} if (s[DIG]>1) o = 1, s[DIG] -= 2;
return s;
}
int main()
{ int i, j;
char a[DIG+1], b[DIG+1];
for (i=0; i<16; i++)
{ i2b(i, a);
printf("%2d\\t", i);
print(a);
j = b2i(a);
printf("%+3d ", j);
comp2(a);
print(a);
j = b2i(a);
printf("%+3d\\n", j);
}
for (i=1; i
i2b(j, b);
printf("%2d -%4d =%3d = ", i, j, i-j);
print(a); printf("- "); print(b);
printf("= ");
comp2(b);
print(a); printf("+ "); print(b);
printf("= ");
print(add(a, b));
printf(" =%4d\\n", b2i(add(a, b)));
} printf("\\n");
}
system("PAUSE");
return 0;
}
有不懂再問。
加油!^_^
2007-01-07 12:37:37 補充:
真值表:
加法 xor and
\|0 1 0 1 0 1
-+-------------
0|0 1 0 1 0 0
1|1 0 1 0 0 1
加法和XOR的真值表是一樣的!
所以,在數位電路上,加法器可用 XOR 閘來做!
不過,記得要加上一個 Carry!(只有在1+1時才有用!)
你把減數傳成2的補數,(你發問的意思是你會做這部份,沒錯吧!?)
只要把被減數和減數的2補數拿來用加法加就可以了!
加完,你要檢查最高的一位數(符號那位)有沒有進位!
沒記錯的話,那是Overflow。
2007-01-07 00:39:15 · answer #1 · answered by ? 7 · 0⤊ 0⤋