博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算机如何实现运算?
阅读量:4478 次
发布时间:2019-06-08

本文共 2204 字,大约阅读时间需要 7 分钟。

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

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

 

转载于:https://www.cnblogs.com/binaryAnt/p/11104901.html

你可能感兴趣的文章
apache+php+mysql环境搭建时,phpinfo里面没有mysql解决办法
查看>>
2018.10.2浪在ACM 集训队第三次测试赛
查看>>
vue3.0学习笔记(一)
查看>>
jQuery跨域
查看>>
MySQL的explain中的参数说明
查看>>
JAVA基本数据类型、引用数据类型-参数传递详解
查看>>
sun.misc.Unsafe 详解
查看>>
食堂排队问题的一个实现
查看>>
Git 回滚代码的正确姿势
查看>>
构造函数、析构函数、虚析构函数、纯虚析构函数要点
查看>>
【原创】学习日记2:nginx配置文件2012.01.06
查看>>
nginx知识图谱
查看>>
[转载]Bison-Flex 笔记
查看>>
[转]Android的Handler总结
查看>>
初始化一个新的服务器
查看>>
ServletConfig
查看>>
顺序栈用C语言实现
查看>>
Python批量获取京东商品列表信息
查看>>
2017.7.10 C组总结
查看>>
SourceTree下载 及使用
查看>>