背景知识
计算机中数字用二进制方式存储,有符号数有三种表示方法,原码,补码,反码。三种表示均在数值前面加了一位符号位(0为正,1为负)
原码:例如,我们用8位二进制表示一个数,+11的原码为00001011,-11的原码就是10001011。原码不利于运算,例如1+(-1)=0,而在二进制中00000001+10000001=10000010,换算成十进制为-2,显然出错了。于是就引入了补码表示。
反码:反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反。
补码:在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。
正数的补码与原码相同
负数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1
例:求-5的补码。(8位二进制)
-5对应正数5(00000101)→所有位取反(11111010)→加1(11111011)
所以-5的补码是11111011。
题目
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
除了四则运算符还有位运算,此题就通过位运算来解
无进位和运算就是按位异或结果,进位是与预算结构,进位影响下一位运算,所以要左移一位

算法步骤:每一次循环算无进位和还有进位,将二者相加直到进位为0
class Solution {
public:
int Add(int num1, int num2)
{
int result1,result2;
while(num2)
{
result1 = num1 ^ num2;
result2 = (num1 & num2) << 1;
num1 = result1;
num2 = result2;
}
return num1;
}
};
网友评论