我们知道,在逻辑代数中,有与、或、非三种基本逻辑运算。通过三种基本逻辑运算之间的组合运算,又可以构造出与非、或非、异或等常用运算。我们在编写计算机代码的时候,通过加减乘除运算符可以很容易地实现该基本运算,但是我们如何使用逻辑运算来实现算术加减乘除基本运算呢?

1、如何只用逻辑运算实现加法运算

在实现代码之前,我们先来分析一下加法的运算特点。例如 ,5和7求和,转换为二进制求和为101和111的求和,其二进制结果为1100,即十进制数12。对于二进制的加法而言,1+1=0,0+1=1,1+0=1,0+0=0,通过对比位运算中的异或运算,不难发现,此方法与位运算中的异或运算形式很类似,唯一不同是异或运算缺少了相应位置的进位。如果我们能够表示出进位,那么加法运算就可以转换成异或运算+进位运算。现在我们考虑如何表示出两位加数相应位置的进位,我们知道,只有1+1=10的时候会产生向高位的进位,其余三种情况进位都为0,那么该形式我们就可以用逻辑运算“与”来表示,为了表示出向高位进位的动作,我们需要将与出来的结果进行向左移位。简而言之,我们的转换思路是:num1+num2=nunm1^num2+(num1&num2)<<1。

#include<stdio.h>
#include<stdlib.h>
int add(int num1,int num2);
void main()
{printf("%d",add(200,300)); system("pause");
}
int add(int num1,int num2)
{ if(0==num2) return num1;//若进位为0,运算结束 int temp=num1^num2; int carry=(num1&num2)<<1; return add(temp,carry);//若存在不为0的进位,则重复运算
}
//转换为非递归后的算法
int add2(int num1,int num2)
{int temp=0; int carry=0; while(num2!=0){ temp=num1^num2;carry=(num1&num2)<<1; num1=temp; num2=carry; } return num1;
}

2、如何只用逻辑运算实现减法运算

将减法转换为加法,实现方法与加法相同,如7-5=7+(-5)。

3、如何只用逻辑运算实现乘法运算

在开始本问题之前,我们先熟悉一些有关位运算的知识

(1)常用的等式:-n=~(n-1)=~n+1。

(2)获取整数n的二进制中的最后一个1:n&(-n)或n&~(n-1)。

(3)去掉整数n的二进制中的最后一个1:n&(n-1)。

我们还是先从一个例子开始分析,1011*1010,因为二进制运算的特殊性,可以将该乘法运算表达式拆分为两个运算,1011*1000和1011*0010的和,从而转换为左移运算,即乘法可以转换为移位和加法运算。最后一个1可以通过n&~(n-1)求得,可通过n&(n-1)去掉,为了高效地得到左移的位数,可以添加一个map容器,算法如下所示:

int multiply(int a ,int b)
{ int sum = 0; map<int, int> m_map; for(int i = 0; i < 32; i++) m_map.insert( pair<int,int>(1 << i, i) );//将int类型的32位状态加入map容器 while(b != 0){ int last_bit = m_map[b&~(b-1)];//取最后一个1的下标 sum += (a << last_bit);//完全只用逻辑运算的话,该句可以调用加法函数实现 b &= b-1; } if(a > 0 && b < 0 || a < 0 && b > 0) sum = -sum; return sum;
}

4、如何只用逻辑运算实现除法运算

(1)一般除法可以采用减法操作或移位操作实现。

减法操作就是循环用被除数减去除数,每减一次值加1,直到被除数小于除数为止。程序如下:

int div(int a,int b )
{ int result=0; if(b==0){ printf("error!"); return; } while(a>=b){ result++; a-=b; } return result;
}

(2)采用移位操作实现,位操作的效率一般都比较高效。

int div2( int a, int b)
{ int left_num = a; int result = 0; while(left_num>=b){ int mul=1;//乘数因子 while(b*mul<=(left_num>>1)) mul = mul << 1; result+=mul; left_num-=b*mul; } return result;
}

如何只用逻辑运算实现算术加减乘除运算相关推荐

  1. sql的加减乘除运算_SQL简单查询语、运算符学习和练习

    本次主要学习了SQL语言的书写和运算,多为实操,一定要多写多思考,综合运用起来. 基本查询语句(select *全部 as替换 distinct删除重复) 指定查询条件(where 从哪里查询) 注释 ...

  2. 定点数和浮点数加减乘除运算详解【计算机组成原理】---真的建议收藏啊!!!

    前言: 你知道计算机内部是如何进行加减运算的吗?可能你知道,那你知道计算机内部是如何进行乘除法运算的呢?肯定和我们十进制运算是不一样的.当我查找资料的时候,发现除了书本很少有这样的知识点.所以我想和大 ...

  3. 详解BigDecimal及其加减乘除运算

    目录 一.BigDecimal概述 二.构造函数详解 1.BigDecimal(int val) 2.BigDecimal(int val, MathContext mc) MathContext 3 ...

  4. java float 加法_JAVA 实现精确的加减乘除运算

    JAVA在加减乘除运算时易发生精度丢失,达不到我们想要的计算结果:为了能够精确表示.计算浮点数,JAVA提供了BigDecimal类,可以以BigDecimal为基础定义一个Arith工具类,代码如下 ...

  5. 简单工厂模式--加减乘除运算

    下面基于简单的<加减乘除运算>实例来讲讲实用简单工厂模式:<备注:以后根据认识的加深,可以添加和修改内容> 需求分析:希望程序提供"加减乘除"四种功能. 功 ...

  6. java用流体加减乘除_任意输入两个数,完成加法、减法、乘法、除法运算!(加减乘除运算分别定义四个方法)_学小易找答案...

    [简答题]编写程序实现菜单设计 [简答题]一层平面图 [简答题]编写一个程序实现大小写字母转换 [简答题]利用循环语句输出一个五行的等腰三角形,如下图 [简答题]编写一个程序实现交换两个变量的数值. ...

  7. matlab 矩阵加减乘除运算

    文章目录 matlab 矩阵加减乘除运算 1 .加.减运算 2. 乘法 3.向量点积 4.向量叉乘 5.混合积 6.矩阵的卷积和多项式乘法 7.反褶积(解卷)和多项式除法运算 8.张量积 9. 除法运 ...

  8. [基础题]2.(*)利用接口做参数,写个计算器,能完成加减乘除运算。

    /*2.(*)利用接口做参数,写个计算器,能完成加减乘除运算. (1)定义一个接口Compute含有一个方法int computer(int n, int m). (2)设计四个类分别实现此接口,完成 ...

  9. 关于浮点型加减乘除运算不精确的问题

    关于浮点型加减乘除运算不精确的问题 先举一个遇到这个错误的项目例子: 之前做一个小模块,由于后端接口还没有完成,需要自己搭建node服务,返回数据,功能需求是实时更新的,这个小模块中本人没有使用web ...

最新文章

  1. 麦子的第一个注解+spring小案例 欢迎指点学习。
  2. (十)python3 只需3小时带你轻松入门——模块与包
  3. 前端学习(1976)vue之电商管理系统电商系统之解决attr_val为空
  4. 巧克力情歌手---McKnight, Brian
  5. pycharm导入自己写的模块时,模块下方出现红色波浪线的解决方案
  6. qiankun 传统项目配置_微前端 qiankun 项目实践
  7. Open vSwitch作为openflow交换机的启动方法
  8. 2021-2025年中国单相静态电能表行业市场供需与战略研究报告
  9. visio是什么软件
  10. c语言——高精度除法
  11. 大连理工大学c语言第三次上机作业答案,第一次上机作业参考答案
  12. JavaScript 特效三大系列总结
  13. 微信公众平台接入广告投放系统
  14. 服务器cpu哪个型号可以超频,CPU超频史上的14个神器:你用过几个?
  15. 对于多目标跟踪论模型CTracker的解析
  16. 360安全卫士系统漏洞修复,漏洞补丁下载成功但安装失败的解决办法
  17. easyui框架实现datagrid多表头设置
  18. API接口幂等性设计
  19. 【Android进阶】天天动听 悬浮歌词 迷你歌词 效果解读
  20. LayoutInflater.from的含义

热门文章

  1. python解决摩尔斯电码
  2. 比特安详细解析Fantasm Finance事件:注重细节,才能历久弥新
  3. hashmap 缩容扩容_java面试必问——hashMap 深入分析put方法
  4. php 生成GUID
  5. cf两边黑屏怎么解决win10_临时解决win10_1903远程桌面黑屏bug
  6. 自制拖把机器人_一种可自动清洗拖把的全自动拖地机器人的制作方法
  7. K-verse 合作伙伴访谈|与 Studio Dragon 一起进入韩剧元宇宙世界
  8. Tableau同比卡片制作
  9. oracle 宿舍管理源码,大学宿舍管理系统web版.doc
  10. native转ascii工具(复制成html文件即可用)