题目:
不使用运算符 +
和-
,计算两整数a
、b
之和。
示例:
若 a = 1 ,b = 2,返回 3。
Calculate the sum of two integers a and b, but you are not allowed to use the operator +
and -
.
Example:
Given a = 1 and b = 2, return 3.
示例代码:
public static int getSum(int a, int b) {
//按位取异或
int result = a^b;
//判断是否需要进位
int forward = (a&b) <<1;
if(forward!=0){
//如有进位,则将二进制数左移一位,进行递归
return getSum(result,forward);
}
return result;
}
本题涉及知识:
1.按位取与(&)
两值按二进制位进行 “与”运算
规则:0&0=0;0&1=0;1&0=0;1&1=1
举个栗子: a = 5 ,b = 3
a:0101
b:0011
r:0001
2.按位取或(|)
两值按二进制位进行 “或”运算
规则:0|0=0;0|1=1;1|0=1;1|1=1
举个栗子: a = 5 ,b = 3
a:0101
b:0011
r:0111
3.按位取异或(^)
两值按二进制位进行 “异或”运算
规则:0^0=0;0^1=1;1^0=1;1^1=0
举个栗子: a = 5 ,b = 3
a:0101
b:0011
r:0110
4.左移运算符“<<”及右移运算符“>>”
左移运算符" << n ":
将一个数的二进制位全部向左移n位,最左边一位舍弃,右边补0。
举个栗子:
a = 5
a<<1
0101 -> 1010
左移一位后,a = a * 2 = 10;
右移运算符">>":将一个数的二进制位全部向右移n位,最右边一位舍弃,左边补0。
举个栗子:
a = 5
a>>1
0101 -> 0010
左移一位后,a = a / 2 = 2;
如有错误,欢迎指出,十分感谢。