位运算练习
剑指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; }