2019.1.22 《剑指Offer》从零单刷个人笔记整理(66题全)目录传送门
这道题主要是练一个常识:用位运算实现加减法。
异或(^)可以实现无进位相加的结果,与(&)可以表示进位的数位。实现进位加法时,只要将进位值右移一位与异或值相加即可,若再次产生进位,则再次相加。
例如2+3(0010+0011),异或值(0010^0011=0001),进位值(0010&0011=0010),进位值右移并与异或值相加(0100^0001=0101)结果为5。
如果没有见过直接记住即可,相当于基础知识。
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
Java实现:
/**
*
* @author ChopinXBP
* 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
*
*/
public class Add_47 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Add(2, 3));
}
//x^y执行加法,(x&y)<<1进位操作
//x+y = x^y + (x&y)<<1
public static int Add(int num1,int num2) {
int loc = num1 ^ num2; //相加数位值
int bit = (num1 & num2) << 1; //进位值
while(bit != 0) {
int carrybit = (loc & bit) << 1;
loc = loc ^ bit;
bit = carrybit;
}
return loc;
}
}
C++实现示例:
class Solution {
public:
int Add(int num1, int num2)
{
return num2 ? Add(num1^num2, (num1&num2)<<1) : num1;
}
};
#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#