`
chenchuangfeng
  • 浏览: 80321 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

算法之道----不用加,减, 乘 ,除 计算 a+b的值

阅读更多

       在面试笔试中会考到这类题目,要求不用加减乘除运算来计算两数和,其实考的就是位运算。

 

       规则1:

       如果1010+0101 = 1111在计算上不产生进位, 则1010^0101 = 1010+0101 = 1111   

     

      上面1010和 0101 二进制加法计算的特点是没有进位,所以他们的二进制加法和按位异或运算结果才会相同。但是如果如果是二进制加法运算有进位,则明显以上等价关系就不能成立。

 

       思路:如 20(10100)+25(11001)  =45二进制加法运算会产生进位,那我们把他转换成a和b两个数 满足a+b = 20+25 = 45且a和b二进制加法不会产生进位,按照规则1有 20+25  = a + b = a ^ b,明显我们可以找到一个例子 a=32(100000) b=13(001101)满足上述要求。

 

       如何找到a 和 b:

当产生进位的时候,我们可以试着把产生进制的位置找出来, 20(10100)+25(11001) 进行按位与运算

10100&11001 = 10000  可知道在最高位是两个1相与,故在最高位产生进位,10100^11001 = 01101这个结果是不进位的结果,只要我们把不进位的异或运算加上进位时候带来的结果增量加起来,就是我们最终想要的结10100+11001 = 101101 .

结果为:10100^11001+(10100&11001)<<1 =  01101+10000 <<1

a  =  01101

b =  10000 <<1 = 100000--->左移位后的结果即为进位产生的增量

 

如果a   b还不满足上面思路中的要求的话,在继续重复上面的过程,知道找出满足思路中的啊a,b的值。

 

代码如下:

#include "stdio.h"
int bitAdd(int a ,int b){
	printf("第一次递归 bitAdd(%d ,%d )\n",a,b );
	int jin = a&b;//进位
	int notJin = a^b;
	if (jin!=0)
	{
		return bitAdd(jin<<1,notJin);
	}else{
		return notJin;
	}
	return 0;
}
 int main()
{
	int a ,b;
	printf("输入两个数做加法(空格隔开)\n");
	scanf("%d %d",&a,&b);
	printf("结果:%d+%d=%d",a,b,bitAdd(a,b));
	return 0;
}

 结果:

 

       

 

 

 

  • 大小: 15.1 KB
4
1
分享到:
评论
7 楼 chenchuangfeng 2013-03-27  
lj830723 写道
问题是在实际开发中这样的使用是否直观,我不是否定使用位运算,而是在理论和实践中尽量的使用能够清晰明了的写法,这样有助于后期的维护和交接。说实话,当我看到这样的代码,第一感觉就是脑壳疼


这显然不是应用在实际开发...这个只是一道笔试题。是考察队底层运算的理解,实例开发肯定是不用这么去写
6 楼 lj830723 2013-03-27  
问题是在实际开发中这样的使用是否直观,我不是否定使用位运算,而是在理论和实践中尽量的使用能够清晰明了的写法,这样有助于后期的维护和交接。说实话,当我看到这样的代码,第一感觉就是脑壳疼
5 楼 chenchuangfeng 2013-03-27  
ansjsun 写道
chenchuangfeng 写道
mengqingyu 写道
这么写比直接运算快很多?实际测过吗?

测试没有..不过底层全是二进制表示,cpu进行加法运算也是通过这样的思路去计算的。

这么容易测试的事情..为什么不去试试呢...效率应该是一样的....说实话..这点优化纯粹就是自找麻烦


这个不是优化算法.....是一些面试笔试题。
4 楼 ansjsun 2013-03-27  
chenchuangfeng 写道
mengqingyu 写道
这么写比直接运算快很多?实际测过吗?

测试没有..不过底层全是二进制表示,cpu进行加法运算也是通过这样的思路去计算的。

这么容易测试的事情..为什么不去试试呢...效率应该是一样的....说实话..这点优化纯粹就是自找麻烦
3 楼 chenchuangfeng 2013-03-27  
mengqingyu 写道
这么写比直接运算快很多?实际测过吗?

测试没有..不过底层全是二进制表示,cpu进行加法运算也是通过这样的思路去计算的。
2 楼 mengqingyu 2013-03-27  
这么写比直接运算快很多?实际测过吗?
1 楼 justjavac 2013-03-27  
在计算机底层,所有的运输都是通过位运算进行的。这个问题只要学过底层的都轻而易举。

相关推荐

    表达式求值 栈实现 c++ 支持加减乘除运算

    - **支持加减乘除运算**:指该程序能够处理包含加、减、乘、除四种基本运算的数学表达式。 #### 描述解析 根据数据结构书编写,编译成功。例如:9/(1+2)# 输出结果为:3;输入9/(1+3)#输出结果为2.25 最后的结束符...

    表达式的计算(C++语言,加 减 乘 除 用栈实现的)

    本主题聚焦于如何利用栈这一数据结构来处理数学表达式中的加、减、乘、除运算。栈是一种后进先出(LIFO)的数据结构,非常适合用于处理运算符的优先级问题。 首先,我们需要理解C++中的基本语法和类型。C++支持基本...

    高精度计算 高精度加减乘除法

    - 首先读取两个待加的数,分别存储在数组 `a[]` 和 `b[]` 中。 - 确定两个数的最大长度 `k`。 - 从最低位开始逐位相加,如果发生进位,则将当前位的结果除以 10 的商作为进位值传递到下一位。 - 最终遍历结果数组 `c...

    乘加和乘减.doc

    例如,如果有一个表达式a * b + c,乘加运算会先计算a与b的乘积,然后将结果与c相加。这种运算在数学和工程领域十分常见,特别是在矩阵运算、微积分和物理方程求解中。在计算机硬件层面,高效的乘加单元(Multiplier...

    五年级(下册)数学分数加减法的计算题(10套)-五下脱式计算题分数加减法.doc

    8. **分数的混合运算**:涉及加、减、乘、除的混合运算时,需要遵循先乘除后加减的法则,并正确使用括号来确定运算顺序。 9. **解比例**:比例是两个比相等的关系,可以通过交叉相乘的方法来解。例如:`x:y = a:b`...

    算法-计算多项式的值(信息学奥赛一本通-T1012)(包含源程序).rar

    首先,多项式是由常数、变量和加减乘运算符组成的数学表达式,如 \( ax^n + bx^{n-1} + ... + cx^2 + dx + e \),其中 \( a, b, c, d, e \) 是系数,\( n \) 是一个非负整数,\( x \) 是变量。在计算机程序中,我们...

    用链表编写的一个加减乘运算器,实现任意大数的加减乘运算

    总的来说,使用链表表示大数并实现加减乘运算,可以灵活地处理任意大小的整数,而无需受制于固定大小的数据类型。这种实现方式不仅有助于理解大数计算的原理,而且在实际编程中也有很高的实用性。通过不断优化算法,...

    快速立即除法的乘法实现(通用算法).txt

    在计算机科学领域,除法操作往往比加减乘等基本算术操作更为耗时。对于一些特定的除数,我们可以利用乘法与移位操作来近似地实现除法运算,这种方法不仅能够显著减少计算时间,而且在很多应用场景下都能得到足够精确...

    ACM_算法模板集.pdf

    - 大数加减乘除等运算的实现。 #### 字符读入 - 实现高效的字符读入功能,如读取单个字符、一行字符串等。 ### 三、数论算法 #### 数论基本算法 - **最大公约数 (Greatest Common Divisor)** - 定义:两个或多个...

    使用C语言写的多元是加减乘

    本项目中,我们关注的是利用C语言实现多元式(多项式)的加减乘运算,这对于理解和掌握数值计算以及计算机科学中的代数理论至关重要。 一元多项式是指形如 `ax^n + bx^(n-1) + ... + cx^1 + d` 的数学表达式,其中a...

    基于C++开发的,可以计算算术逻辑表达式的算法工程

    在计算机科学中,算术表达式通常包括数字、运算符(如加、减、乘、除)以及括号,用于表示数学计算。本工程可能采用了中缀表达式(即常见的运算符在操作数之间的形式,如2 + 3)或后缀表达式(也称为逆波兰表示法,...

    算术表达式求值完整课程设计报告-对于基本的算术表达式,以字符序列的形式从终端进行输入,要求语法正确的,不含变量,按照算术运算优先级顺序,实现基本算术表达式的运算过程。

    - 支持加、减、乘、除四种基本运算。 - 可以处理包含括号的表达式。 - 提供动态输入和实时输出的功能。 3. **算法设计**: - 使用两个栈:一个运算符栈(OPTR)用于存储运算符,一个操作数栈(OPND)用于存储...

    汇编程序设计加减乘除四则运算论文流程图加源码

    - 判断操作类型:根据用户输入确定是加、减、乘还是除。 - 执行运算:根据操作类型调用相应的运算子程序。 - 结果处理:存储结果并可能显示给用户。 - 错误处理:处理可能出现的异常,如除数为零等。 四、源码分析 ...

    最新北师大版七年级数学上册《整式及其加减》单元测试题及答案.pdf

    在题目中,例如“2a+3b”和“a+b”就是简单的整式,它们可以通过加减运算合并。例如,长方形周长的计算涉及到整式的加法。 2. **同类项**:同类项是指含有相同字母并且字母的指数相同的项。在题目4中,判断两个项...

    高一信息科技算法与程序设计复习.doc

    * 假设变量 a 的值是 1,变量 b 的值是 2,变量 c 的值是 3,计算下列表达式的值。 + a^3+b*c + 7c mod b +a + 2int(c/b) &gt;b-a + Fa&lt;b and (c-a)/2&gt;0 + Ta+b&gt;c or b+c&gt;a and c+a&gt;b 二、算法的一些概念 * 用...

    24点算法及程序

    1. **基础操作**:对于两个数a和b,有四种基本运算:a+b、a-b、a*b、a/b(b≠0)。 2. **扩展操作**:如果还有两张以上的数,可以先对其中两张进行基础操作,再与其他数进行组合。 3. **括号使用**:为了改变运算...

    辗转相除计算辗转相除计算辗转相除计算

    - **多项式**:是由变量与常数通过加减乘运算组合而成的表达式,形如 \(a_nx^n + a_{n-1}x^{n-1} + \cdots + a_1x + a_0\),其中 \(a_n, a_{n-1}, \ldots, a_1, a_0\) 为系数,\(n\) 为该多项式的次数。 - **基础篇*...

    java 扑克牌24点算法

    - **四则运算**:对`a`与`b`进行加、减、乘、除四种运算,并将结果存储在新创建的对象`ab`中。 - **递进组合**:继续嵌套循环,依次选择第三个数字(`c`)和第四个数字(`d`),确保它们不与前两个数字重复。 - **...

    上海高一信息技术算法与程序设计习题集.pdf

    算术运算符包括加(+)、减(-)、乘(*)、除(/)、乘方(^)和求余(mod),它们用于处理数值的计算。数值关系运算符如大于(&gt;)、小于(&lt;)、等于(=)、大于等于(&gt;=)、小于等于()和不等于()用于比较两个...

    分数四则混合运算计算题专题训练500题(脱式计算).doc

    - 利用分配律,如(a+b)c=ac+bc,a(b+c)=ab+ac,可使计算简化。 - 运用结合律和交换律,改变运算顺序,使计算更为便捷。 3. **混合运算的顺序**: - 先乘除后加减,同级运算从左到右。 - 括号内的运算优先于括号...

Global site tag (gtag.js) - Google Analytics