0113——寻找除法的位运算方法,来尝试减少运算时间
举个简单的例子,比如15(0b1111) / 3(0b0011) = 5(0b0101)。
即 5*3 = 15 ,(2^3 * 0 + 2^2 * 1 + 2^1 * 0 +2^0 * 1) * 3 = 15
那么可以制作一个这样的数组。依次是[(3 * 2^3), (3 * 2^2), (3 * 2^1), (3 * 2^0)],而这个数组并不需要真的用乘法算。
只需要将被除数左移即可,即[(3 << 3), (3 << 2), (3 << 1), (3 << 0)],我们知道计算机中,位移运算的速度是很快的。
def divide(self, dividend: int, divisor: int) -> int:
# 判断是否同号
flag = (dividend > 0 and divisor > 0) or (dividend < 0 and divisor < 0)
ret = 0
# 全部过程使用正数处理,根据flag返回结果的符号
dividend, divisor = abs(dividend), abs(divisor)
# 预处理二进制数组
binary = [0 for _ in range(33)]
# 第0位即2的零次方乘上除数,所以就是除数本身
binary[0] = divisor
for i in range(1, 33):
# 后面每一位是前面一位的两倍,因为二进制
# << 是位运算左移操作,等价于*2,但是速度更快
binary[i] = binary[i-1] << 1
for i in range(32, -1, -1):
if binary[i] <= dividend:
dividend -= binary[i]
# 答案加上2^i
ret += (1 << i)
return min(ret, (1 << 31) - 1) if flag else -ret
-
2025/2/26 不用改别人的shit山了,终于自己写项目代码,开始使用APL-FML-HDL分层软件架构
-
2025/4/2 我在工程项目中使用了循环队列,用于消息数据缓存,和中断实现驱动芯片时序,很有成就感
-
2025/5/2 完成了cortexM3和M0的boot与app跳转,M0只能把中断向量表放在RAM中