A + B 问题 (简单介绍位运算)

给出两个整数 a 和 b , 求他们的和

1.题目

给出两个整数a和b,求他们的和。

2.思考

a+b,我们不管使用什么语言a+b都是很容易实现的比如常见的java,该算法可以直接 return (a + b);该算法已经完成。如此简单肯定不是只有这样的,

3.代码实现:

1.非递归实现

    public int aplusb(int a, int b) {
        int carrySum, originalSum;
        //a ^ b 是不进位的原位和
        //a & b 产生进位的地方
        //a & b << 1 是进位和
        //当进位和等于0时,原位和就是a+b的和
        //如果进位和不等于0时,a = 原味和,b = 进位和,继续按照如上
        //方式进行计算,直到进位和为0
        while (b != 0){
            carrySum = a ^ b;
            originalSum = (a & b) << 1;
            a = carrySum;
            b = originalSum;
        }
        return a;
    }

2.递归实现

    public int aplusb(int a, int b) {
        //递归实现
        if (b == 0){
            return a;
        }
        return aplusb((a ^ b),((a & b) << 1));
    }

4.了解一下位运算

位运算时对字节或字中的实际位进行检测、设置或者移位,它只适用于字符型和整数型变量及他们的变体,对其他数据类型不适用

① 、&:位运算逻辑与

逻辑与的运算规则:当进行两个数的逻辑与运算时,先将他们转化为二进制,然后进行逻辑与运算,当相同位的数只有双方都为1时结果才为1,否则为0

②、 |:位运算逻辑或

逻辑或的运算规则:当进行两个数的逻辑或运算时,先将两个数转化为二进制,然后进行逻辑或运算,当相同位的数只要有一方为1结果就为1,否则为0

③、 ^: 位运算逻辑异或

逻辑异或运算规则:当进行两个数的逻辑异或时先将两个数转化为二进制,然后进行逻辑异或运算,当相同位的数只有当双方都为不同数字时结果才是1,否则为0

④、 ~: 位运算反

逻辑反的运算规则:当进行一个数的逻辑反运算时,先将这个数转化为二进制,然后进行逻辑反运算,当数为1时结果为0,当数为0时结果为1

⑤、 >>: 右移

右移操作运算规则:左边空出的位用0或者1补,正数用0补,负数用1填补。

当一个数进行n位的右移操作后所得到的新的数=被操作数/2^n

⑥、 <<: 左移

左移运算操作规则:右边空出的位用0补,高位左移溢出则舍弃该高位。

当一个数进行n位左移操作之后,所得到的新的数=被操作数*2^n

5.位运算加法

1.a^b 是按位相加后没有进位的和

2.a&b 是产生进位的地方

3.(a&b) << 1 的到进位后的值

4.按位相加后原位和+进位和就是加法的和,依次计算直到进位和为0之后。

你可能感兴趣的:(算法)