HWK#1 Write two functions in any of the 3 languages C/C++/Java:
           long add(long a, long b);  // return a+b
           long sub(long a, long b);  // return a-b
      But these operations are NOT allowed in your program:
         +  -  *   /  %  +(positive)  -(negative)
      Hint: use &  |  ~  ^   (and, or, not, xor)

Due: 2010/03/31 
Hint: 仔細研究此範例如何模仿人由右往左做 bit by bit 加法,
      然後把做 4 bit 改為做 32 bit 就可 (long 有 32 bits)
      或是你的函數叫用這四 bit adder 八次也可完成 32 bits 運算,
      但要注意 Carry 須處理正確.  
Homework(習題格式和繳交): (因學校 bb.nctu 不穩, 改繳交紙本) 
     o 習題包括程式題和非程式題, 視情況會有大約 8題 +/- 2題;
       習題繳交時須包括running script及discussion report, report須用
       三孔活頁紙或與A4同大小的紙單面書寫或打字, 第一頁為title page,
       接著是你做這習題的方法, 心得和遇到的問題等, 然後才是running script。
       running script 包括你的編譯/連結過程, 執行測試過程,
       最後才是有列號的程式碼 (產生列號的C/C++/Java程式在範例附錄) 

Sample program to add two 4-bit numbers  (其實稍微改一下就可做 long)
  1 //add.c --4bit Adder + - * / % , +n, -n (正負號) are NOT allowed
  2 #include <stdio.h>
  3 int addOne(int), carryOut;  // carryOut FLAG is used in doAdd()
  4 int fourBitAdd(int aIn, int bIn, int cIn, int*cOut);
  5 int doAdd(int a, int b) {
  6     int ans; int carryOutTemp;
  7     ans = fourBitAdd(a,  b, 0, &carryOutTemp);
  8     carryOut = carryOutTemp;   // 有些 compiler 不認識 ::carryOut
  9     return ans;   // note that carryOut is a Global variable
 10 }
 11 char bb[][8]={"0000","0001","0010", "0011","0100", "0101","0110",
 12  "0111", "1000","1001","1010","1011","1100","1101","1110","1111"};
 13 int doSub(int a, int b) {return doAdd(a, doAdd(~b, 1)); } 
 14 int main( ) {  int a, b, ans;   
 15    for(a=0; a <= 15; a = addOne(a) ) {  // addOne(a) will return a+1
 16        for(b=0; b <= 15; b = addOne(b) ) {
 17           printf("a=%d, b=%d;", a, b); ans = doAdd(a,b);
 18     printf(a < 10?" ":""); if(b < 10)printf(" "); if(ans < 10)printf(" "); 
 19     printf(" a+b=%d, Carry=%d; %02X=%s;", ans, carryOut, ans, bb[ans]);
 20           printf("\t a-b=%d, Carry=%d\n", doSub(a, b), carryOut);
 21        }//for(b
 22    }//for(a
 23    return 0;   // main should return 0 to indicate OK
 24 }//main(  
 25 int carryBit, andMask, orMask = 1;   // binary 000...0001
 26 int addThenLeft(int n) {   // recursive till orMask is 0
 27     andMask = ~orMask;  carryBit = 0;  // assume not carry
 28     if((n & orMask) == 0) { n = n | orMask;  return n; }  // bit = 0
 29     n = n & andMask; carryBit = 1;    // carry to next left bit
 30     orMask = orMask << 1;   // shift the orMask to Left one bit
 31     if(orMask == 0) return n;   // All bit Done
 32     return addThenLeft(n);    // perform adding next LEFT bit
 33 }//addThenLeft(
 34 int addOne(int n){   //  return n plus one
 35     orMask = 1;   // binary 000...0001
 36     return  addThenLeft(n);
 37 }// addOne(  
 38 int sum(int a, int b) {   // sum of one bit half Adder
 39     return (a & 1) ^ (b & 1);  // a xor b
 40 }//sum(
 41 // carry of one bit Adder
 42 int carry(int a, int b) { return (a & 1) & (b & 1); }//carry(
 43 int halfAdd(int a, int b, int*cOut){   // *cOut is for carry
 44     *cOut = carry(a, b); return sum(a, b); }   
 45 int fullAdd(int a, int b, int cIn, int*cOut){
 46     *cOut = (a & b) | (a & cIn) | (b & cIn);
 47     return a ^ b ^ cIn;   // sum of 3 bits
 48 }//fullAdd(
 49 int fourBitAdd(int aIn, int bIn, int cIn, int*cOut){
 50     int mask[ ]={ 1, 2, 4, 8}; //bit mask for bit0, bit1,bit2,bit3
 51     int a[4], b[4], s[4], c[4], ans, i, cay;  // cay is carry
 52     int cayPrev = cIn;
 53     i=0; // 若不用 while Loop, 可定義 Macro, 然後叫用 macro 四次
 54     while( i < 4 ) {   // extract 4 bits into a[], b[] 
 55         a[i] = (aIn & mask[i]); if(a[i]) a[i] = 1;
 56         b[i] = (bIn & mask[i]); if(b[i] != 0) b[i] = 1;
 57         s[i] = fullAdd(a[i], b[i], cayPrev, &c[i]);  // sum
 58         cayPrev = c[i];  // carry to next bit     // Carry
 59         i = addOne(i);//Loop control     
 60     }//while  
 61     *cOut = cayPrev;   // carry Out
 62     ans = i = 0;    // for Loop is also OK for the following
 63     if(s[0]) ans |= mask[0];
 64     if(s[1]) ans |= mask[1];
 65     if(s[2]) ans |= mask[2];
 66     if(s[3]) ans = ans | mask[3];
 67     return ans;
 68 }// fourBitAdd(



You are the -th visitors to this page.
有沒有不帶 Line numbers 的 sample add.c ?
沒有, 自己 copy/paste 後想辦法去掉 Line numbers :-)!
Hint: 若是用 vi 或 vim (gogle 一下就可抓到 PC 版):
只要打入 :1,$s/^...../g
這樣就可以把每列左邊五格任何字都去掉 !
回作業目錄       回課程目錄