计算机如何实现运算?

计算机是一个统称,实现计算的部件是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

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

 

上一篇:给水


下一篇:02编程语言及python初识