跳转至

0113——寻找除法的位运算方法,来尝试减少运算时间

位运算实现加、减、乘、除

LeetCode29 Medium 不用除号实现除法

举个简单的例子,比如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中