题目:剑指 Offer 65. 不用加减乘除做加法
题目描述:
写一个函数,求两个整数之和,要求在函数体内不得使用 “
+”、“
-”、“
*”、“
/” 四则运算符号。
思路都在代码里
代码:
class Solution:
def add(self
, a
, b
) -> int:
a
&= 0xffffffff
b
&= 0xffffffff
while b
:
carry
= ((a
& b
) << 1) & 0xffffffff
a
^= b
b
= carry
if a
< 0x80000000:
return a
else:
return ~(a
^0xffffffff)
加点东西:
一些位运算应用:
(1)判断奇偶 a和1按位于,若a为奇数结果为1,偶数结果为0 因为奇数二进制最后一位是1,偶数二进制最后一位是0
(2)交换数值a,b a ^= b b ^= a a ^= b 因为a(ab)=aab=0^b=b(交换律)
(3)寻找列表中只出现一次的数字 交换律
(4)计算一个数的二进制中有多少个1 x与(x-1)进行&运算,可以检出x的二进制中存在的最后一个1 如:
x = 1110 0000 x-1 = 1101 1111 x = x&(x-1) = 1100 0000 循环直到x=0