通过移位的方式实现相加算法

简介:  #include <iostream>   //加减乘除,都是靠位运算,   //将来从事手机端,嵌入式开发,位操作, class jia;//声明,只能声明指针或者引用   jia  *pjia1; jia *& pjia2 = pjia1; //jia& jia2; //jia


#include <iostream>

 

//加减乘除,都是靠位运算,

 

//将来从事手机端,嵌入式开发,位操作,

class jia;//声明,只能声明指针或者引用

 

jia  *pjia1;

jia *& pjia2 = pjia1;

//jia& jia2;

//jiajia1;

 

//intx=1024

 

class jia

{

public:

    jia(int a, int b) :x(a), y(b)

    {

    }

    int jiafa()

    {

        return x + y;

    }

    int getx()

    {

        return x;

    }

    int gety()

    {

        return y;

    }

    int newjiafa(int a, int b)

    {

        if (a == 0)

        {

            return b;

        }

        else if (b == 0)

        {

            return a;

        }

        else

        {

            int res = a^b;//先求结果

            int wei = (a&b) << 1;//进位,左移,乘以2

            //a+b=a^b+(a&b)<<1;

            std::cout << "res=" << res << " " << "wei=" << wei << "\n";

            return newjiafa(res, wei);

        }

    }

 

private:

    int x;

    int y;

};

 

int newjiafa(int a, int b)

{

    if (a == 0)

    {

        return b;

    }

    else if (b == 0)

    {

        return a;//让相与慢慢趋势于0

    }

    else

    {

        int res = a^b;//先求结果

        int wei = (a&b) << 1;//进位,左移,乘以2

        //a+b=a^b+(a&b)<<1;//表达式

 

        std::cout << "res=" << res << " " << "wei=" << wei << "\n";

        return newjiafa(res, wei);

    }

}

 

void main1()

{

    //std::cout << newjiafa(11, 22) << std::endl;

 

    jia  jia1(10, 9);

    std::cout << jia1.jiafa() << std::endl;

    std::cout << jia1.newjiafa(jia1.getx(), jia1.gety()) << std::endl;

    std::cin.get();

}

 

void main2()

{

    int num;

    std::cin >> num;

    int i = 0;

    while (num)

    {

        i++;

        num &= num - 1;//让数据趋向于0

    }

 

    std::cout << i << std::endl;

    std::cin.get();

    std::cin.get();

}

 

int get1(int num)

{

    int count = 0;//表示位数

    unsigned int  flag = 1;//0000001  flag

    //   1111  num

 

    //0000001      1

    //flag  000001

    //num      1111

 

    //flag   0000010

    //num      1111

 

    //  0000010

    //flag   0000100

    //num      1111

 

    //  00000100

    //flag   0001000

    //num       1111

 

    //  000001000

    //flag   00010000

    //num       1111

    //0

    while (flag)

    {

        std::cout << num << "  " << flag << std::endl;

        if (num & flag) //不为0就自增

        {

            count++;

        }

        flag = flag << 1;

    }

 

    return count;

}

 

void main()

{

    int num;

    std::cin >> num;

    int i = 0;

 

    i = get1(num);

    std::cout << i << std::endl;

    std::cin.get();

    std::cin.get();

}

目录
相关文章
|
算法
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
268 0
顺序表应用1:多余元素删除之移位算法
顺序表应用1:多余元素删除之移位算法
|
JavaScript 算法 前端开发
【前端算法】JS实现数字千分位格式化
JS实现数字千分位格式化的几种思路,以及它们之间的性能比较
544 1
|
存储 前端开发 算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
311 0
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
|
存储 前端开发 算法
链表两数相加使用JavaScript解题|前端学算法
链表两数相加使用JavaScript解题|前端学算法
310 0
链表两数相加使用JavaScript解题|前端学算法
一则有趣的算法题:两个栈实现一个队列
一则有趣的算法题:两个栈实现一个队列
|
算法 计算机视觉 Python
Python实现KNN算法和交叉验证
Python实现KNN算法和交叉验证
578 0
Python实现KNN算法和交叉验证
|
算法 数据挖掘 Python
利用python实现Apriori关联规则算法
利用python实现Apriori关联规则算法
880 0
利用python实现Apriori关联规则算法
|
算法 Java Go
运筹优化学习21:Java调用Cplex实现求解Cuting Stock Porblem的列生成算法详解(下)
运筹优化学习21:Java调用Cplex实现求解Cuting Stock Porblem的列生成算法详解
运筹优化学习21:Java调用Cplex实现求解Cuting Stock Porblem的列生成算法详解(下)
|
算法 Java 决策智能
运筹优化学习21:Java调用Cplex实现求解Cuting Stock Porblem的列生成算法详解(中)
运筹优化学习21:Java调用Cplex实现求解Cuting Stock Porblem的列生成算法详解
运筹优化学习21:Java调用Cplex实现求解Cuting Stock Porblem的列生成算法详解(中)

热门文章

最新文章