计算机如何实现运算?

Posted binaryant

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机如何实现运算?相关的知识,希望对你有一定的参考价值。

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

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

 

以上是关于计算机如何实现运算?的主要内容,如果未能解决你的问题,请参考以下文章

如何利用多核电脑实现Matlab的并行运算

计算机的算数运算 知识梳理

c语言如何实现两个整数的乘法运算?

LeetCode:位运算实现加法

20191218《信息安全导论》第四周总结

python3简单实现支持括号的加减乘除运算