计算机运算单元的计算,计算机如何实现运算?

计算机是一个统称,实现计算的部件是CPU,在CPU内部有一个ALU

afb6023cebfa7288c15f1349643d259e.png

维基介绍

算术逻辑单元(英语:Arithmetic Logic Unit, ALU)是中央处理器的执行单元,是所有中央处理器的核心组成部分,由与门和或门构成的算数逻辑单元,主要功能是进行二进制的算术运算,如加减乘(不包括整数除法)。基本上,在所有现代CPU体系结构中,二进制都以补码的形式来表示。

下面有几个题目:

1.不使用加减乘除实现加法运算

2.不使用加减乘除实现减法运算

3.不使用减乘除实现乘法运算

如果你知道答案,就没必要往下看啦,反之继续阅读

先说加法

f5d6be3ebe2d739af9ea574684fe2527.png

代码实现

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)

fcc61a0069a53d48c3da51cdd6f40f2c.png

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

第三次:乘数已经判断完了,结束

标签:xor,运算,0001,0010,int,如何,v2,0000,计算机

来源: https://www.cnblogs.com/binaryAnt/p/11104901.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值