位运算练习

剑指Offer 65:不用加减乘除进行俩个数的相加

  题目要求:写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。

  二进制中整数的相加,我们举个例子:

  

5 和 6相加
5的二进制为:0101
6的二进制为:0110
它们二进制相加为:1011,结果为11

但是题目要求不允许使用+号运算符,所以我们使用位运算符进行模拟相加

二进制相加一般有俩种情况:1、同个位置上的数相加为1或是0,这种情况只要使用异或运算符"^"对俩个数的二进制进行运算即可,同位数上不同为1,相同为0,0+0=0,而1+1交由进位运算去处理
2、同个位置上的数都为1,这个时候该位置上需要为0,并且向前一位进1,我们可以使用与运算符"&"将同位上都为1的位数都置为1,而后再使用左移运算符"<<"左移一位,即可模拟出进位运算的结果
    //不使用加减乘除做加法
    public int add(int a, int b) {
        //不需要担心负数,因为数值在计算机中都是使用补码来存储,正负数的计算一致

        while(b!=0){
            int c=(a&b)<<1;// a&b是与运算,都为1才为1
            //如果a&b==1,说明这俩个数该位都等于1,则相加需要进1位,所以左移1位
            a^=b; //a^b是异或运算,当a和b对应的位数不同才为1
            b= c;
        }
        //俩个数的加法运算可以过程为:如5和6 二进制分别为0101和0110,相加结果为1011 转换成十进制就为11
        return a;
    }

 

posted @ 2022-07-14 18:10  况况况  阅读(110)  评论(0)    收藏  举报