您的位置:首页 > 职场人生

【剑指Offer】面试题47:不用加减乘除做加法

2017-07-07 10:43 375 查看
一:题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号

二:解体分析

对数字做运算,除了四则运算,也就只剩下位运算了

如5+17=22

5的二进制表示101,17的二进制表示10001

第一步:各位相加不计进位,结果为10100

第二步:记下进位,最后两个1相加产生进位,二进制表示位10

第三步:将前两步的结果相加 10100+10=10110 ,转换为10进制正好是22

接下来将二进制的加法用位运算进行表示

第一步:不考虑进位对每一位相加

0     0     =0

0     1     =1

1     0     =1

1      1    =0

这和异或的结果是相同的

第二步:考虑进位

0     0     无

0     1     无

1     0     无

1      1    有

这和与运算的结果是一样的

第三步:将前面的两个结果相加。直到不产生进位为止

按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现

按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现

按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,

求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反

左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,

高位丢弃,低位补0

右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数

应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定

三:代码实现

class Solution {
public:
int Add(int num1, int num2)
{
int sum;//异或的结果
int carry;//进位的结果

do{
sum=num1^num2;
carry=(num1 & num2)<<1;

num1=sum;
num2=carry;
}
while(num2!=0);

return num1;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指Offer C++ 位运算