leetcode系列题五----位运算
剑指 Offer II 001. 整数除法
剑指 Offer II 002. 二进制加法2
剑指 Offer II 003. 前 n 个数字二进制1的个数(动态规划)
前言
位运算在机考中很少,一般会出现在面试当中,要求手撕
其内容大多是加减乘除,不允许使用相应运算符。解题思路一般也是如下:
‘>>’ 为/2
'<<'为*2
^异或为无进位加法
&与再<<左移一位 为进位情况
&1为 %2对2取余
难点主要在数位溢出的考虑
例题
剑指 Offer II 001. 整数除法
'''
1,从最大的开始减
2,a>>1 - b避免溢出
3,正负使用sign来标识
4,全部转化为负数运算回避边界问题
'''
MAX_INT = 2**31-1
MIN_INT = -2**31
#边界
if a == MIN_INT and b == -1:
return MAX_INT
# 负数
sing = -1 if (a>0)^(b>0) else 1
a = abs(a)
b = abs(b)
res = 0
for i in range(31,-1,-1):
if (a>>i) - b>=0:
res += 1<<i
a = a-(b<<i)
else:
pass
return res if sing==1 else -res