計算機是一個統稱,實現計算的部件是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
第三次:乘數已經判斷完了,結束