計算機如何實現運算?


計算機是一個統稱,實現計算的部件是CPU,在CPU內部有一個ALU

維基介紹

  算術邏輯單元英語:Arithmetic Logic Unit, ALU)是中央處理器的執行單元,是所有中央處理器的核心組成部分,由與門或門構成的算數邏輯單元,主要功能是進行二進制算術運算,如加減乘(不包括整數除法)。基本上,在所有現代CPU體系結構中,二進制都以補碼的形式來表示。

下面有幾個題目:

  1.不使用加減乘除實現加法運算

  2.不使用加減乘除實現減法運算

  3.不使用減乘除實現乘法運算

如果你知道答案,就沒必要往下看啦,反之繼續閱讀

  先說加法

    

代碼實現

int _add(int v1,int v2) {
  int nRet = 0;
  do {
    nRet = v1 ^ v2;
    v2 =(v1 & v2) << 1;
    v1 = nRet;
  } while (v2);
  return nRet;
}

 手工測試

  5+5=?

    101      101

xor    101  and 101

------------------------------------------

      000      101

 

    0000       0000

xor    1010  and 1010

------------------------------------------

     1010       0000

結果是:二進制1010  轉換一下   (0*2^0)+(1*2^1)+(0*2^2)+(1*2^3)=10

咋們進行說減法

  減法和加法一樣的道理,至於為什么需要了解補碼(補碼設計牛逼我想應該沒人反駁)

int _bitSub(int a,int b){
	b = -b;
	do{
		int nXorResult = a^b;
		b = (a&b)<<1;//b是退出循環的判斷指
		a = nXorResult;//a是結果
	}while(b);	
	return a;
}

手工測試(本來想偷懶,不繼續演示了......)

   1-1 (把減數的符號取反,然后采用加法的運算方式)

       0001    0001

xor  1111  and  1111

-------------------------------------

      1110    0001

 

       1110        1110

xor  0010  and  0010

--------------------------------------

       1100     0010

    

       1100        1100

xor  0100  and  0100

--------------------------------------

      1000      0100

 

       1000        1000

xor  1000  and   1000

--------------------------------------

       0000      1000

 

       00000         00000

xor  10000  and   10000

--------------------------------------

      10000                 00000

 這里需要注意,咋們是做的4位bit的運算,超出的直接截斷,所以結果是二進制0000 

  1--1(把減數的符號取反,然后采用加法的運算方式)

    0001    0001

xor    0001    0001
-------------------------------------

    0000    0001  

 

    0000    0000

xor    0010    0010
-------------------------------------

    0010    0000

結果:二進制0010 轉為十進制是2  

證明打開方式正確

 

乘法的實現先考慮這樣一個問題

十進制:100*10  = 答案你應該秒知道,  100*100呢?100*100=10000

注:后綴b表示 二進制數字

二進制:100b*100b=你知道等於多少嗎?其實這里和十進制是一樣的道理  100b*100b=10000b  (通過這個結果其實就是把 被乘數向左移動了2位, 100<<2=10000

 

int _mul(int v1,unsigned int v2) {
    int nRet = 0;
    int nLeftMove = 0;
    do {
        if (v2 & 1) {
            nRet += v1 << nLeftMove;
        }
        v2 = v2>>1;
        nLeftMove++;
    }
    while(v2); 
    return nRet;
}

  5*2=101b*10b

第一次:判斷10b的   0  不是1,條件不滿足不移動被乘數

第二次:判斷10b的   1     是1,條件滿足移動被乘數,101b<<1b=1010b

第三次:乘數已經判斷完了,結束

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM