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



#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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涂作权的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值