题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用 +、-、×、÷ 四则运算符号。
数据范围
−1000≤num1,num2≤1000
样例
输入:num1 = 1 , num2 = 2
输出:3
算法1
(全加器/位运算)
看大佬们的分析即可
C 代码
int add(int num1, int num2){
//方法1 直接加 题目不允许
// return num1+num2;
//方法2 全加器(串行加法 二进制)
// int cin=0,ret=0,i; //cin 进位值,ret最终结果
// int x,y,temp; //暂存 为了好写注释
// for(i=0;i<32;i++){ //依次求最低位到最高位
// //直接这样写就行
// // ret |= ((num1>>i & 1) ^ (num2>>i & 1) ^ cin)<<i;
// // cin=((num1>>i & 1) & (num2>>i & 1)) | ((num1>>i & 1) & cin) | ((num2>>i & 1) & cin);
// x=num1>>i & 1; //num1的低i位
// y=num2>>i & 1; //num2的低i位
// temp=x ^ y ^ cin; //对应的ret的低i位 模2加法(异或、不进位加法)
// ret|=temp<<i; //右移i位 和ret按位或 即可只修改ret的低i位
// cin=(x&y) | (x&cin) | (y&cin); //更新进位 即x y cin中至少两个为1时 就会产生进位 (&和&&都行 因为x y cin不是0就是1)
// }
// return ret;
//方法3 位运算 与全加器有点类似 (& 得到每位的进位情况,^ 得到每位只计算该位置上的数后的结果)
int sum=num1^num2,carry=(num1&num2)<<1,temp;
while(carry!=0){ //循环至每个位置都无进位
temp=sum^carry; //得到每位只计算该位置上的数后的结果
carry=(sum&carry)<<1; // 得到每位的进位情况 右移是因为本位的进位 下次计算时 是和左边相邻位计算 (括号不能少 因为<<的优先级 高于 &)
sum=temp; //更新结果
}
return sum;
}
求关注