加法的实现-不用加减乘除运算

来源:互联网 发布:数据自动生成图表 编辑:程序博客网 时间:2024/06/05 17:42

来源于一个笔试题目

笔试面试题目都很有意思….
笔试题如下:

不使用加减乘除,计算一个数字的7倍

位运算

相信你第一个想到的方法就是位运算吧,没错,除了位运算,也没有其他办法了吧。
位运算以计算效率高、占用空间小等优点著称,在平时写程序的过程中,可以考虑加入一些位运算,来提高一下程序的执行效率。

题目分析

首先,求一个数字的倍数,首先对应的位运算就是移位

num <<1 ; // *2num <<2 ; // *4num <<3 ; // *8

7倍? 出题人怎么能这么容易就让你得出结果!如果距离答案更近一些的话,就是:

(num <<3) - num;

但是,不能用减法(加法),因此,还要解决一个加减法问题,才能取得真经。

知识准备

首先解决的是加法问题,计算机组成原理中讲过基本的加法的实现过程。
这里,我们其实只需要实现一个基本的加法:

a b a + b 进位 0 0 0 无 0 1 1 无 1 0 1 无 1 1 0 有

从上面的表可以看出一种实现简单的多位二进制整数加法的算法如下:

m 和 n 是两个二进制整数,求 m + n:

  1. 用与运算求 m 和 n 共同为 “1” 的位: m’ = m & n
  2. 用异或运算求 m和 n 其中一个为 “1” 的位: n’ = m ^ n
  3. 如果 m’ 不为 0,那么将 m’ 左移一位(进位),记 m = m’ <<1,记 n = n’,跳回到步骤 1
  4. 如果 m’ 为 0,那么 n’ 就是我们要求的结果。

    实践应用

    C++ 代码如下

int addofnumber(int &m, int &n){        int a=m,b=0;        while(a!=0)        {                a = (m & n) << 1;                b = m ^ n;                m = a;                n = b;        }        return b;}

完整的测试程序

#include <iostream>using namespace std;int addofnumber(int &m, int &n);int addofnumber(int &m, int &n){        int a=m,b=0;        while(a!=0)        {                a = (m & n) << 1;                b = m ^ n;                m = a;                n = b;        }        return b;}int main(){    int num=20;    cout<<addofnumber(num<<3,-num);     return 0;}
0 0
原创粉丝点击