计算机是一个统称,实现计算的部件是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
第三次:乘数已经判断完了,结束