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