描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
评论说Python并不太适合做位运算操作,这题先来看一下C版本。
补码:
- 如果n为正数,则原码=反码=补码
- 如果n为负数,则补码=反码+1
假设现在输入两个整数,然后把它们转化位二进制形式a和b,那题目要求的求和就是s=a+b。
其中a(i),b(i)分别表示a,b的第 i 位(也就是二进制的第 i 位)。
那么就存在下面四种情况:(官方题解)
跟上面的&操作、^操作相同。
但是无进位和运算就是按位异或结果,进位就是与运算结果但是需要左移一位,可以理解成二进制那一位饱和了,需要前进一位。
所以s = a + b,其实就是他们二进制下的无进位和+进位的结果。
这里我用的是5+6的示例。
如果是一个数为负数或者两个数都为负数怎么办?加入补码。
class Solution {
public:
int Add(int num1, int num2)
{
while (num2 != 0) {
// 负数左移会在低位补1,所以转化为无符号整数
int c = ((unsigned int)(num1 & num2)) << 1;
num1 ^= num2;
num2 = c;
}
return num1;
}
};
来自https://blog.nowcoder.net/n/e6eecb2263154c39a2f360f60b0e92ce?f=comment
python代码讨论组也有:
# -*- coding:utf-8 -*-
class Solution:
def Add(self, a, b):
while(b):
a,b = (a^b) & 0xFFFFFFFF,((a&b)<<1) & 0xFFFFFFFF
return a if a<=0x7FFFFFFF else ~(a^0xFFFFFFFF)